remove nulls from example ejemplo java list garbage-collection

nulls - vector java ejemplo



Java List.clear() vs. List=null (4)

Esta pregunta ya tiene una respuesta aquí:

Estoy ejecutando mi aplicación en un generador de perfiles y el uso de la memoria es mucho más alto de lo que esperaba, donde los objetos siguen existiendo después de que ya no se necesitan. La mayoría de ellos están en listas donde el objeto de la lista se ha ido fuera de contexto.

¿Le toma al recolector de basura más tiempo liberar objetos que están en una lista, incluso si ya no se hace referencia a la lista? Si es así, ¿liberarán antes si llamo a clear () en la lista antes de que salga fuera de contexto?

gracias - Dave


En términos de la mecánica de recolección de basura, usted está preguntando si las raíces de la GC tienen alguna prioridad sobre todos los demás objetos que se pueden alcanzar de forma transitoria al ser detectados como inalcanzables. Dada la forma en que funcionan los algoritmos de barrido de marcas, no hay diferencia entre estos dos. Todos esos objetos basura se marcarán en el mismo pase y la accesibilidad interna de un objeto desde dentro de un objeto inalcanzable no tiene ningún impacto en esto.

Encontrar una gran cantidad de objetos inalcanzables que aún no se recuperan no es nada inusual y en realidad beneficia el rendimiento general de la aplicación: solo cuando falla la asignación de memoria se ejecutará el GC. Si le preocupa el tamaño de su pila, simplemente reduzca el tamaño máximo de pila. Esto causará una recolección de basura más frecuente.


Sé que recibiste tu respuesta, pero quería aclararlo ... si tu vieja generación tiene un tamaño de 1 GB pero solo almacenas 1 MB dentro de ella, entonces no hay absolutamente ninguna necesidad de que funcione el GC. De hecho , no desea que se ejecute en este momento, porque si lo hiciera, tendría eventos de detener el mundo activados por el algoritmo de barrido de marca (marcando y remarcando fases).

El GC se activa solo cuando hay presión en la memoria.


Sí. clear eliminará las referencias a los objetos en la lista, al menos la implementación de la lista ArrayList lo hará. Sin embargo, si su objeto List completo está fuera del alcance de todos modos, no gana nada.


Si tomamos una ArrayList como ejemplo, el método clear() hace esto:

public void clear() { modCount++; // Let gc do its work for (int i = 0; i < size; i++) elementData[i] = null; size = 0; }

Básicamente, si los elementos de una lista no están referenciados en ningún otro lugar del código, realmente no hay necesidad (o al menos no se gana nada) de llamar a clear() . Tampoco es necesario asignar null a la Lista porque se recolectará basura tan pronto como se salga del alcance.