¿Se recogen los tipos primitivos de basura en Android?

Sé que esto puede ser una pregunta tonta, pero mi fondo es más en C + + y la gestión de mi propia memoria.

Actualmente estoy cortando cada asignación que puedo de uno de mis juegos para tratar de reducir la frecuencia de recolección de basura y percibido "lag", por lo que para cada variable que creo que es un objeto (String y Rect por ejemplo) I me estoy asegurando de que lo creo antes de mano en mi constructor y no crear variables temporales en 10 simples funciones de línea … (Espero que tenga sentido)

De todas formas yo estaba trabajando aunque más esta noche y me di cuenta de que puedo estar completamente equivocado acerca de mi supuesto en la recolección de basura y los tipos primitivos (int, boolean, float) son estas variables de tipo primitivo que creo en una función de 10 líneas que se llama 20 veces por segundo añadiendo a mi problema de recolección de basura?

Así que hace un año, cada pocos segundos vería un mensaje en logcat como

GC libera 4010 objetos / 484064 bytes en 101ms

Ahora veo ese mensaje cada 15-90 segundos más o menos …

Así que para reformular mi pregunta: ¿Están los tipos primitivos (int, float, boolean, etc) incluidos al ver este mensaje?

Los tipos primitivos no son objetos, por lo que no causan ninguna recolección de basura. Sin embargo, usted tiene que ser muy cuidadoso porque debido al boxeo un tipo primitivo puede fácilmente convertirse en un objeto sin que explícitamente hacerlo.

Por ejemplo, si desea un HashMap <> de claves enteras, debería usar HashMap. Tenga en cuenta que debido a que "int" no es un objeto, no se puede utilizar en un contenedor. Entero es una versión de objeto de un int primitivo. Al escribir código como este, un objeto Entero se creará automáticamente para usted:

HashMap<Integer, Object> map = new HashMap<Integer, Object>(); int someNum = 12345; // no object created. map.put(someNum, null); // Integer object created. 

Tenga en cuenta que lo mismo ocurrirá si no utiliza genéricos, pero aún más escondido:

 HashMap map = new HashMap(); int someNum = 12345; // no object created. map.put(someNum, null); // Integer object created. 

Para esta situación en particular, puede utilizar la clase SparseArray de Android, que es un contenedor de claves enteras primitivas.

Parece que la respuesta es no. Parece que las primitivas se ponen en la pila en Java y no en el montón y sólo los objetos se recolectan basura. He encontrado un montón de breves referencias a esto alrededor, ver en Wikipedia. Para leer algo más pesado, vea un artículo sobre una implementación de recolección de basura de JVM que explica un poco más claramente que las primitivas se almacenan en ubicaciones de memoria físicamente separadas, por lo que no se incluyen erróneamente en la recolección de basura aquí . Si te apetece rozar, la página 4 es donde esto se explica más directamente.

aquí están los hilos específicos de android que indican que el gc escanea solamente los indicadores y cómo él comprueba eso

[Nota: todavía no tengo privilegios de comentarios completos, por lo que estoy añadiendo esto como una respuesta aparte.]

Parece que las primitivas se ponen en la pila en Java y no en el montón y sólo los objetos se recolectan basura.

Esto no es muy preciso. Las primitivas pueden mantenerse en variables locales y también como campos estáticos o de instancia de clases. En este último caso, están realmente almacenados en el montón, pero no tienen una "vida" propia y en particular no están separados del objeto que contienen.

Android no ejecuta una JVM basada en pila estándar, tiene su propia VM basada en registro.

Esta es una declaración verdadera, pero también es un poco engañosa y al lado del punto de la pregunta original. De hecho, cuando un método llama a otro (y así sucesivamente), los marcos de activación de estos métodos se almacenan en una pila en la implementación de Dalvik. La diferencia es que, al examinar un marco de activación de forma aislada, los marcos de activación de Dalvik no contienen dentro de ellos una pila de tamaño variable. En este sentido, la forma en que Dalvik organiza los marcos de activación es más parecido a cómo se manejan para los lenguajes tradicionales de tipo C (como C o C ++).

  • Consulta sobre propiedades en /system/build.prop
  • Android Studio Depuración lenta en el dispositivo
  • Android - Phonegap - La conversión al formato Dalvik falló con error 1
  • ¿Tiene el tiempo de ejecución de ART Android las mismas limitaciones de límite de método que Dalvik?
  • El tamaño de mapa de bits supera el presupuesto de VM cuando el desarrollo de juegos
  • Smali estructura de métodos y clases
  • ¿Los emuladores o Genymotion apoyan el ART, el sustituto dalvik?
  • Funcionamiento de la colada en diversos niveles al tirar abajo
  • ¿Cómo puedo ejecutar Dalvik Op-Codes
  • ¿Es posible inyectar código en una aplicación Android?
  • Generación dinámica de bytecode Dalvik en una aplicación en ejecución de Dalvik / Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.