2012-10-03 16 views

Respuesta

14

De Nikita Salnikov-Tarnovski's blog:

El montón superficial es fácil - se compone de sólo el montón ocupado por el objeto en sí. Hay algunos matices sobre cómo calcularlo, pero para el alcance de este artículo lo dejamos tal como está. Estén atentos para futuras publicaciones sobre el mismo tema.

El montón retenido es en muchos aspectos más interesante. Solo en raras ocasiones están interesados ​​en el montón superficial, en la mayoría de los casos su pregunta real se puede traducir a "Si elimino este objeto de la memoria, ahora el recolector de basura puede liberar mucha memoria".

Ahora, como todos recordamos, todos los algoritmos de recolección de basura de Java (GC) siguen esta lógica:

1) Hay algunos objetos que son considerados “importantes” por el GC. Estos se llaman raíces GC y (casi) nunca se descartan. Son, por ejemplo, , que ejecutan las variables locales del método y los parámetros de entrada , subprocesos de aplicación, referencias del código nativo y objetos "globales" similares.

2) Se supone que todos los objetos a los que se hace referencia desde esas raíces de GC están en uso y, por lo tanto, no se descartan por el GC. Un objeto puede hacer referencia a otro en formas diferentes en Java, en el caso más común, un objeto A se almacena en un campo de un objeto B. En tal caso, decimos "B hace referencia a A".

3) El proceso se repite hasta que todos los objetos que pueden ser transitivos alcanzados desde las raíces de la GC se visiten y marquen como "en uso".

4) Todo lo demás no se utiliza y se puede desechar.

+0

Curioso, ¿cuál es la otra forma en que un objeto puede hacer referencia a otro que no sea almacenado en el campo? – marekdef

+0

@marekdef No se moleste en preguntar aquí. Intente comentar el [blog original del autor] (https://plumbr.eu/blog/how-much-memory-what-is-retained-heap). – Gilles

1

En palabras simples Un montón poco profundo de un objeto es su tamaño en el montón y el tamaño retenido del mismo objeto es la cantidad de memoria de montón que se liberará cuando el objeto sea basura. More Details

6

From eclipse memory analyser docs

vs. Shallow retenidas Heap

montón Shallow es la memoria consumida por un objeto. Un objeto necesita 32 o 64 bits (según la arquitectura del sistema operativo) por referencia, 4 bytes por entero, 8 bytes por largo, etc. Dependiendo del formato de volcado del montón , el tamaño puede ajustarse (por ejemplo, alineado a 8, etc. ...) para modelar mejor el consumo real de la máquina virtual.

El conjunto retenido de X es el conjunto de objetos que serían eliminados por GC cuando X es basura recolectada.

montón Retenido de X es la suma de los tamaños de poca profundidad de todos los objetos en la retenido conjunto de X, es decir, la memoria mantiene viva por X.

En términos generales, montón superficial de un objeto es su tamaño en el montón y el tamaño retenido del mismo objeto es la cantidad de memoria de montón que se liberará cuando el objeto sea basura.

El retenido establece para un conjunto líder de objetos, tales como todos los objetos de una clase particular o todos los objetos de todas las clases cargadas por un cargador de clase particular o simplemente un montón de objetos arbitrarios, es la conjunto de objetos eso se libera si todos los objetos de ese conjunto inicial se vuelven inaccesibles. El conjunto retenido también incluye estos objetos como todos los demás objetos a los que solo se puede acceder a través de estos objetos. El tamaño retenido es el tamaño de almacenamiento dinámico total de todos los objetos contenidos en el conjunto retenido . enter image description here

El Retenido Tamaño mínimo da una estimación bueno (bajo) del tamaño retenido que se calcula maneras más rápido que el exacto retenido tamaño de un conjunto de objetos. Solo depende del número de objetos en el conjunto inspeccionado, no del número de objetos en el volcado del montón.

Cuestiones relacionadas