recolector collector basura activar java garbage-collection

java - basura - activar garbage collector



¿Qué es el recolector de basura en Java? (16)

Como los objetos son dinámicamente asignados por el nuevo operador, puede preguntar cómo se destruyen estos objetos y cómo se libera la memoria ocupada. En otros lenguajes, como C ++, necesita liberar objetos asignados manualmente de forma dinámica mediante el operador de eliminación. Java tiene un enfoque diferente; Gestiona automáticamente la desasignación. La técnica se conoce como una recolección de basura .

Funciona de esta manera: cuando no hay referencias a un objeto, se supone que este objeto ya no es necesario y puede recuperar la memoria ocupada por el objeto. No es necesario destruir objetos explícitamente como en C ++. La recolección de basura ocurre esporádicamente durante la ejecución del programa; No sucede simplemente porque hay uno o más objetos que ya no se usan. Además, varias implementaciones de Java en tiempo de ejecución tienen diferentes enfoques para la recolección de basura, pero la mayoría de los programadores no tienen que preocuparse por escribir programas.

Soy nuevo en Java y estoy confundido sobre el recolector de basura en Java. ¿Qué es lo que realmente hace y cuándo entra en acción? Por favor, describa algunas de las propiedades del recolector de basura en Java.


El recolector de basura es un programa que se ejecuta en la máquina virtual Java que elimina los objetos que ya no están siendo utilizados por una aplicación Java. Es una forma de gestión de memoria automática .

Cuando se está ejecutando una aplicación Java típica, está creando nuevos objetos, como String sy File s, pero después de un cierto tiempo, esos objetos ya no se usan. Por ejemplo, eche un vistazo al siguiente código:

for (File f : files) { String s = f.getName(); }

En el código anterior, la String s se está creando en cada iteración del ciclo for . Esto significa que en cada iteración, se asigna un poco de memoria para hacer un objeto String .

Volviendo al código, podemos ver que una vez que se ejecuta una sola iteración, en la siguiente iteración, el objeto String que se creó en la iteración anterior ya no se usa, ese objeto ahora se considera "basura".

Eventualmente, comenzaremos a obtener mucha basura, y la memoria se usará para objetos que ya no se usan. Si esto continúa, eventualmente la Máquina Virtual Java se quedará sin espacio para crear nuevos objetos.

Ahí es donde interviene el recolector de basura.

El recolector de basura buscará objetos que ya no se usan y se deshace de ellos, liberando la memoria para que otros objetos nuevos puedan usar esa porción de memoria.

En Java, el recolector de basura se encarga de la administración de la memoria, pero en otros lenguajes como C, uno necesita realizar la administración de la memoria por sí mismo usando funciones como malloc y free . La administración de la memoria es una de esas cosas que son fáciles de cometer errores, que pueden conducir a lo que se llama pérdidas de memoria , lugares donde la memoria no se recupera cuando ya no se usan.

Los esquemas de administración automática de la memoria, como la recolección de basura, hacen que el programador no tenga que preocuparse tanto por los problemas de administración de la memoria, por lo que puede concentrarse más en desarrollar las aplicaciones que necesitan desarrollar.


El recolector de basura es un componente de jvm.

Se usa para recolectar basura cuando la CPU se libera.

Aquí basura significa objetos no utilizados que se ejecuta en el fondo del programa principal

para monitorear el estado del programa principal.


El recolector de basura se puede ver como un administrador de recuento de referencia. si se crea un objeto y su referencia se almacena en una variable, su recuento de referencia se incrementa en uno. durante el curso de la ejecución si esa variable está asignada con NULL. el conteo de referencia para ese objeto se reduce. por lo que el conteo de referencia actual para el objeto es 0. Ahora cuando se ejecuta el recolector de basura, comprueba los objetos con el recuento de referencia 0. y libera los recursos asignados.

La invocación del recolector de basura está controlada por las políticas de recolección de basura.

Puede obtener algunos datos aquí. http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html


Garbage Collection en Java (y otros lenguajes / plataformas también) es una forma para que el entorno de tiempo de ejecución (JRE) de Java reutilice la memoria de los objetos java que ya no son necesarios. Simplificamente, cuando el JRE se inicia inicialmente, le pide al Sistema Operativo (O / S) una cierta cantidad de memoria. A medida que el JRE ejecuta su (s) aplicación (es) usa esa memoria. Cuando la aplicación finaliza con esa memoria, aparece el "Recolector de basura" de JRE y recupera esa memoria para que la usen diferentes partes de su (s) aplicación (es) existente (s). El "Recolector de basura" de JRE es una tarea en segundo plano que siempre se está ejecutando e intenta seleccionar los momentos en que el sistema está inactivo para continuar con las tiradas de basura.

Una analogía del mundo real sería la de los basureros que vienen a su casa y recogen su basura reciclable ... eventualmente, la reutilizan de otras maneras usted y otras personas.


Garbage Collector es parte de JRE que se asegura de que el objeto que no se referencia se libere de la memoria.
Por lo general, se ejecuta cuando la aplicación se queda sin memoria. AFAIK contiene un gráfico que representa los enlaces entre los objetos y los objetos aislados se pueden liberar.
Para guardar el rendimiento de los objetos actuales agrupados en generaciones, cada vez que GC escanea un objeto y encuentra que todavía se hace referencia a su recuento de generación incrementado en 1 (hasta un valor máximo máximo, creo que 3 o 4), la nueva generación se escanea primero (cuanto más corto sea el objeto en la memoria, más probable es que ya no sea necesario), por lo que no se escanean todos los objetos cada vez que se ejecuta GC.
lea this para más información.


La recolección automática de basura es el proceso de observar la memoria del montón, identificar qué objetos están en uso y cuáles no, y eliminar los objetos no utilizados. Un objeto en uso, o un objeto referenciado, significa que alguna parte de su programa aún mantiene un puntero a ese objeto. Un objeto no utilizado, u objeto sin referencia, ya no se referencia en ninguna parte de su programa. Por lo tanto, la memoria utilizada por un objeto sin referencia puede recuperarse.

En un lenguaje de programación como C, asignar y desasignar memoria es un proceso manual. En Java, el recolector de basura maneja automáticamente el proceso de desasignación de memoria. Por favor, consulte el enlace para una mejor comprensión. http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html


La recolección automática de basura es un proceso donde la JVM elimina o mantiene ciertos puntos de datos en la memoria para liberar espacio para el programa en ejecución. La memoria se envía primero a la memoria del montón, que es donde el recolector de basura (GC) hace su trabajo, luego se decide terminar o guardarse. Java supone que no siempre se puede confiar en el programador, por lo que finaliza los elementos que cree que no necesita.


La recolección de basura se refiere al proceso de liberar automáticamente la memoria en el montón eliminando objetos que ya no son accesibles en su programa. El montón es una memoria que se conoce como la tienda gratuita, representa un gran conjunto de memoria no utilizada asignada a su aplicación Java.


Libera la memoria asignada a los objetos que ya no están siendo utilizados por el programa, de ahí el nombre "basura". Por ejemplo:

public static Object otherMethod(Object obj) { return new Object(); } public static void main(String[] args) { Object myObj = new Object(); myObj = otherMethod(myObj); // ... more code ... }

Sé que esto es extremadamente artificial, pero aquí después de llamar a otherMethod() el Object original creado se vuelve inalcanzable, y eso es "basura" que obtiene basura recolectada.

En Java, el GC se ejecuta automáticamente, pero también puede llamarlo explícitamente con System.gc() e intentar forzar una gran colección de basura. Como señala Pascal Thivent, realmente no debería tener que hacer esto y podría hacer más daño que bien (vea esta pregunta ).

Para obtener más información, consulte la entrada de wikipedia en la recolección de basura y la recolección de elementos defectuosos (de Oracle)


Los principios básicos de la recolección de basura son encontrar objetos de datos en un programa al que no se puede acceder en el futuro y reclamar los recursos utilizados por esos objetos. https://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29

Ventajas

1) Salva de errores, que ocurren cuando se libera una pieza de memoria mientras todavía hay punteros a ella, y uno de esos punteros es desreferenciado. https://en.wikipedia.org/wiki/Dangling_pointer

2) Errores gratuitos dobles, que ocurren cuando el programa intenta liberar una región de memoria que ya ha sido liberada, y que tal vez ya haya sido asignada de nuevo.

3) Evita ciertos tipos de pérdidas de memoria, en las que un programa no puede liberar la memoria ocupada por objetos que se han vuelto inalcanzables, lo que puede provocar el agotamiento de la memoria.

Desventajas

1) Consumir recursos adicionales, impactos en el rendimiento, posibles paradas en la ejecución del programa e incompatibilidad con la gestión manual de los recursos. La recolección de elementos no utilizados consume recursos informáticos para decidir qué memoria liberar, aunque el programador ya haya conocido esta información.

2) El momento en que se recolecta realmente la basura puede ser impredecible, lo que da como resultado espacios (pausas para cambiar / memoria libre) dispersos a lo largo de una sesión. Los puestos impredecibles pueden ser inaceptables en entornos de tiempo real, en el procesamiento de transacciones o en programas interactivos.

Tutorial de Oracle http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

La recolección de basura es el proceso que identifica qué objetos están en uso y cuáles no, y eliminando los objetos no utilizados.

En un lenguaje de programación como C, C ++, asignar y liberar memoria es un proceso manual.

int * array = new int[size]; processArray(array); //do some work. delete array; //Free memory

El primer paso en el proceso se llama marcado. Aquí es donde el recolector de basura identifica qué piezas de memoria están en uso y cuáles no.

Paso 2a. La eliminación normal elimina los objetos sin referencia que dejan los objetos y punteros referenciados para liberar espacio.

Para mejorar el rendimiento, queremos eliminar objetos sin referencia y también compactar los objetos referenciados restantes. Queremos mantener los objetos referenciados juntos, por lo que será más rápido asignar nueva memoria.

Como se dijo anteriormente, tener que marcar y compactar todos los objetos en una JVM es ineficiente. A medida que se asignan más y más objetos, la lista de objetos crece y crece lo que lleva a un tiempo de recolección de basura cada vez más largo.

Continúa leyendo este tutorial y sabrás cómo GC toma este desafío.

En resumen, hay tres regiones del montón, YoungGeneration para objetos de vida cortos, OldGeneration para objetos de período largo y PermanentGeneration para objetos que viven durante la vida de la aplicación, por ejemplo, clases, bibliotecas.


Mucha gente piensa que la recolección de basura recolecta y descarta objetos muertos.
¡En realidad, la recolección de basura de Java está haciendo lo contrario! Los objetos en vivo son rastreados y todo lo demás es basura designada.

Cuando un objeto ya no se utiliza, el recolector de basura recupera la memoria subyacente y la reutiliza para la futura asignación de objetos. Esto significa que no hay eliminación explícita y no se devuelve ninguna memoria al sistema operativo. Para determinar qué objetos ya no se usan, la JVM ejecuta de forma intermitente lo que se llama acertadamente un algoritmo de marca y barrido.

Verifique esto para obtener más información detallada: http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx


Un objeto se vuelve elegible para la recolección de basura o GC si no se puede acceder desde ningún subproceso en vivo o por referencias estáticas.

En otras palabras, puede decir que un objeto es elegible para la recolección de basura si todas sus referencias son nulas. Las dependencias cíclicas no se cuentan como referencia, por lo que si el objeto A tiene una referencia al objeto B y el objeto B tiene una referencia al objeto A y no tienen ninguna otra referencia activa, entonces ambos objetos A y B serán elegibles para la recolección de basura.

Heap Generations para recolección de basura -

Los objetos Java se crean en Heap y Heap se divide en tres partes o generaciones por el bien de la recolección de basura en Java, estos se denominan generación joven (nueva), generación sostenida (antigua) y área permanente del montón.

New Generation se divide en tres partes conocidas como espacio Eden, Survivor 1 y Survivor 2. Cuando un objeto creado por primera vez en heap se crea en nueva generación dentro del espacio Eden y después de la recolección de basura menor subsiguiente, si un objeto sobrevive se traslada al sobreviviente 1 y luego al sobreviviente 2 antes de que la recolección de basura principal moviera ese objeto a generación anterior o permanente .

Perm espacio de Java Heap es donde JVM almacena metadatos sobre clases y métodos, grupo de cadenas y detalles de nivel de clase.


Un objeto se vuelve elegible para la recolección de basura o GC si no se puede acceder desde ningún subproceso en vivo o por referencias estáticas.

En otras palabras, puede decir que un objeto es elegible para la recolección de basura si todas sus referencias son nulas. Las dependencias cíclicas no se cuentan como referencia, por lo que si el objeto A tiene una referencia al objeto B y el objeto B tiene una referencia al objeto A y no tienen ninguna otra referencia activa, entonces ambos objetos A y B serán elegibles para la recolección de basura.

Heap Generations para recolección de basura -

Los objetos Java se crean en Heap y Heap se divide en tres partes o generaciones por el bien de la recolección de basura en Java, estos se denominan generación joven (nueva), generación sostenida (antigua) y área permanente del montón.

New Generation se divide en tres partes conocidas como espacio Eden, Survivor 1 y Survivor 2. Cuando un objeto creado por primera vez en heap se crea en nueva generación dentro del espacio Eden y después de la recolección de basura menor subsiguiente, si un objeto sobrevive se traslada al sobreviviente 1 y luego al sobreviviente 2 antes de que la recolección de basura principal moviera ese objeto a generación anterior o permanente .

Perm espacio de Java Heap es donde JVM almacena metadatos sobre clases y métodos, grupo de cadenas y detalles de nivel de clase.

Consulte aquí para obtener más información: recolección de basura

No puede obligar a JVM a ejecutar Garbage Collection aunque puede realizar una solicitud utilizando System.gc() o Runtime.gc() .

En java.lang.System

public static void gc() { Runtime.getRuntime().gc(); }

En java.lang.Runtime

public native void gc(); // note native method

Mark and Sweep Algorithm -

Este es uno de los algoritmos más populares utilizados por la recolección de basura. Cualquier algoritmo de recolección de basura debe realizar 2 operaciones básicas. Uno, debería ser capaz de detectar todos los objetos inalcanzables y, en segundo lugar, debe reclamar el espacio de montón usado por los objetos basura y hacer que el espacio esté disponible nuevamente para el programa.

Las operaciones anteriores se realizan mediante Mark y Sweep Algorithm en dos fases:

  1. Fase de marca
  2. Fase de barrido

lea aquí para más detalles - Mark and Sweep Algorithm


el recolector de basura implica que los objetos que el programa ya no necesita son "basura" y pueden desecharse.