2010-12-29 26 views

Respuesta

6

Los objetos creados dentro del alcance del método son elegibles para la recolección de basura cuando el método está cerrado, a menos que esa referencia se devuelva como el valor de retorno. En ese caso, la persona que llama puede o no ceñirse a esa referencia y evitar que se gc'd.

Dado que el recolector de basura funciona con su propio hilo de acuerdo con sus propias luces, no necesariamente sabe cuándo se limpia un objeto, o si los objetos asignados en otro lugar también son elegibles o no.

+0

@duffymo: ¿Esto no depende de si la referencia del nuevo objeto creado existe después del retorno de la función? E.g. un objeto almacenado en una colección que está en el alcance de la persona que llama. – Cratylus

+0

@user: en ese caso, el alcance del objeto ha cambiado y GC no puede afectarlo. – Jeremy

+0

"Objetos creados dentro del alcance del método ..." para mí significa que no fue transferido por el usuario. Tiene razón acerca de una cosa: si el objeto creado en el alcance se devuelve como el valor de retorno, entonces la persona que llama puede retener la referencia y evitar que se gc'd. Enmendaré mi respuesta. – duffymo

3

Esto no es tan fácil: al final todos los objetos se crean con algún método.

El compilador VM necesita realizar un análisis de ruta de escape para detectar si una referencia de este objeto puede escapar de alguna manera: imagine llamar a newObject.toString(). Usted y yo sabemos (esperamos) que esto no causará daños y que el objeto aún no se referencia, ya que no se vinculará con una variable global. Pero el VM no lo hace.

Mientras que una máquina virtual moderna hará ese tipo de análisis y tratará objetos reales de vida corta especiales en la recolección de basura, desde un punto de vista de "alto nivel" son solo objetos. Todo lo demás es una sofisticada optimización de bajo nivel.

Y, como dice duffymo, cuando se liberan exactamente estos objetos es incierto.

1

El hecho de que la ejecución del método haya finalizado y ahora el objeto esté fuera del alcance es irrelevante.
La recolección de elementos no utilizados es una operación implícita del sistema de tiempo de ejecución que se ejecuta en un hilo separado en paralelo con su código, implementando un algoritmo de recolección de basura específico.
El subproceso de recolección de basura se ejecuta en tiempos impredecibles, pero muy a menudo, aproximadamente cada segundo según documentos de Java y cuando la memoria está casi agotada, evaluando qué objetos son elegibles para ser recolectados, es decir, no hay referencias de raíz punteros, por ejemplo, variables estáticas
De modo que cada objeto accesible por un puntero raíz está marcado y recursivamente los objetos referenciados por estos objetos, etc.
Esto puede significar escanear todo el espacio de proceso. Una vez hecho esto, todos los objetos que no están "marcados" en el escaneo previo van a la lista libre (son GC).
Esta es una operación pesada como puede ver.

La ejecución de ese método tiene completado.

Por lo tanto, el hecho de que esté fuera del alcance de un método que llamó porque se ha completado, es irrelevante. No significa que el tiempo de ejecución sabe en ese punto que el objeto está hecho (ya que el GC se ejecuta en paralelo).
No es como en C++ que al final del método el programador llamaría eliminar en el objeto ya que no es necesario. No se llama automáticamente a "borrar" al final del método en Java.
El subproceso GC finalmente se dará cuenta de que no hay más referencias al objeto asignado en el montón por el método y lo CG.
puede llamar a la GC en cualquier momento si lo desea por:

System.gc(); 

Pero el GC se ejecutará antes o después de todos modos.
Una cosa a tener en cuenta es que siempre que haya una referencia a un método por un puntero raíz no puede ser GC.
Si en su método crea a través de new un objeto en el montón y almacena la referencia en un contenedor que es estático o se lo devuelve al llamador, el objeto sobrevive al método.

+0

La recolección de basura ha mejorado mucho desde los días de Smalltalk. Ninguna máquina virtual de grado comercial le gusta más. Muchas informaciones pueden ser google sobre algoritmos reales. – mtraut

+0

System.gc() es más o menos una sugerencia para la VM que sería una buena idea ahora activar una gc. No puede confiar en que esto se reconozca Y (incluso si la VM acepta) puede confiar en que después de recoger la basura gc(). Esto siempre es asincrónico. – mtraut

+0

@mtraut: Me estoy inclinando hacia esto también.Pero los javadocs parecen decir lo contrario: 'Cuando el control regresa de la llamada al método (System.gc), la Máquina Virtual de Java ha hecho un mejor esfuerzo para recuperar el espacio de todos los objetos descartados' – Cratylus

2

Ciclo

un programa Java Vida objeto crea muchos objetos de diferentes clases. Objeto en Java, interactuar mediante el envío de mensajes entre sí. Después de que terminen de procesar, estos objetos son recolectados. Después del proceso de recolección de basura, el sistema operativo reclama los recursos asignados a estos objetos que serán utilizados posteriormente por nuevos objetos.

A continuación se presentan las fases en el que un objeto Java atraviesa a cabo su ciclo de vida:

1. Clase Cargando

Antes de crear objeto de una clase, la clase debe ser cargado en la memoria del disco. El cargador de clases java carga el archivo de clase a la memoria.

¿Cuándo se carga la clase?

  • la primera vez que se está creando el objeto.

  • se accede a cualquier campo o método estático por primera vez.

inicializadores estáticos

Java busca cualquier inicializadores estáticos e inicializa los campos estáticos que son parte de la clase y no parte de una instancia específica de la clase (objeto).

3. creación de objetos de

objeto es una instancia de la clase. Se crea en las siguientes situaciones:

Declaración: cuando declara un objeto, p. ClassA objA; Instanciación: cuando se usa nuevo para asignar un nuevo objeto en la memoria del montón, p. Ej. nueva clase A(); Inicialización: el objeto nuevo se construye, p. Clase A(); 4. Uso del objeto

En esta etapa, los programas podrían usar el objeto ya sea accediendo a los campos o a los métodos de llamada.

5. Limpieza de

Ésta es la última fase de la objetos Java en el que se reciclan y la memoria es reclamada por el sistema operativo.

¿Qué sucede en la destrucción?

El objeto se elimina de la memoria. Java descarta sus referencias internas a este objeto. Garbage Collection (GC), ejecuciones que liberan objetos que ya no se necesitan, es decir, no hay referencias a este objeto. Finalización: GC brinda a los objetos una oportunidad de última oportunidad para limpiar cualquier otro recurso llamando a su método finalize().

cuando sucede?

cuando el objeto queda fuera del alcance. es decir {... objA ...}, aquí} se convierte en ámbito. en este momento, el tiempo de ejecución de Java verifica las referencias y permite a GC reciclar este objeto. cuando el número de referencias a este objeto en la memoria de tiempo de ejecución java se vuelve cero (0). cuando el objeto se establece explícitamente en nulo, es decir, objA = null ;, se llama GC se llama explícitamente el método finalize().

Cuestiones relacionadas