¿El método ArrayList.clear () libera memoria?
Si no me equivoco, ArrayList contiene el valor de las ubicaciones de memoria en las que se almacenan las variables que ha agregado a la Lista. Por lo tanto, mi suposición es que cuando se llama al método ArrayList.clear () sólo libera los valores mencionados (de las ubicaciones de memoria), pero no libera las ubicaciones de memoria en sí. Voy a tratar de ilustrar esto con un ejemplo:
Digamos que tienes el estado actual de la memoria:
- Tamaño de una aplicación Android de Hello World
- Agregar una ScrollView simple a la Galería provoca una pérdida de memoria
- Android: liberación de la memoria asignada AnimationDrawable está utilizando hasta
- Memoria interna llena de imágenes, probablemente causada por Bitmap.compress (formato, int, flujo)
- Enorme byte en mi aplicación después de HPROF
[Memory location] (type of variable) *value* [1000] (int) 32 [1002] (int) 12 [1003] (float) 2.5
Y los agrega a la lista myList, por lo que contiene punteros a las ubicaciones de memoria 1000, 1002, 1003.
Cuando llama a myList.clear () los punteros serán anulados, pero las ubicaciones de memoria 1000, 1002, 1003 todavía contendrían valores previamente dados. ¿Me equivoco?
- Desplazamiento de las imágenes de pantalla en la memoria
- Problema con la descarga de varios archivos con AsyncTask
- Android OutOfMemory pero con memoria de sobra
- Uso de la memoria V8
- Limpiar la memoria del montón para Excepción de memoria perdida
- Escaneo y edición de valores de memoria de aplicación de Android mediante programación
- Lenta Cargando imágenes grandes con Picasso
- Filtro de mercado para clase de memoria
Está correcto porque la memoria es borrada asincrónicamente por el recolector de basura y no directamente por tales funciones de biblioteca. clear
sólo anularía todos ellos y actualizaría el estado de ArrayList
consecuencia.
Si alguno o todos estos elementos no son referenciados por ninguna otra parte de su código, se convierten en elegibles para la recolección de basura, y pueden ser destruidos + des-asignados en cualquier momento desde poco después de esa llamada hasta el final del tiempo.
clear
sólo elementos de matriz de respaldo nulos
public void clear() { modCount++; for (int i = 0; i < size; i++) elementData[i] = null; size = 0; }
Pero si llamamos ArrayList.trimToSize
after clear
matriz de respaldo after clear
se encoge
public void trimToSize() { modCount++; int oldCapacity = elementData.length; if (size < oldCapacity) { elementData = Arrays.copyOf(elementData, size); } }
No, no aclarará la memoria. Después de usted clear()
.
Vea el código fuente de clear ()
public void More ...clear() { 474 modCount++; 475 476 // Let gc do its work 477 for (int i = 0; i < size; i++) 478 elementData[i] = null; 479 480 size = 0; 481 }
El método está haciendo que los elementos sean elegibles para Garbage Collector.No los limpie de inmediato. Una vez que el GC se ejecuta, se han ido.
La respuesta a su pregunta, no liberará la memoria. Sólo eliminará todas las referencias de objeto. Ahora estos objetos pueden o no pueden ser recogidos por el recolector de basura dependiendo de cómo se refieren en otros lugares. Por ejemplo, el objeto 1 se refiere -> objeto 2 ArrayList se refiere -> objeto 2 ArrayList se refiere -> objeto 3
En este caso, después de Arraylist.clear (), el objeto 3 será elegible para la limpieza pero no el objeto 2.