Los objetos se crean utilizando NUEVO, pero no hay una operación de eliminación correspondiente para reciclar la memoria ocupada por el objeto. Cuando completamos el uso de un objeto, simplemente dejamos de referirnos a ese objeto: cambie nuestra referencia para señalar a otro objeto o a NULL; o regresar del método para que las variables locales del método ya no existan, de modo que la referencia a estas variables locales no apunte a ningún objeto. Los objetos a los que ya no se hace referencia se llaman basura. El proceso de encontrar y reciclar estos objetos se llama recolección de basura o
Las máquinas virtuales de Java usan la recolección de basura para garantizar que los objetos referenciados se retengan en la memoria, y también liberarán el espacio de almacenamiento ocupado por objetos que no se pueden usar a través de cualquier referencia en el código de ejecución. Esta es una fuerte garantía de que si un objeto no se recicla si la cadena de referencia que comienza desde la referencia raíz (es decir, referencias a las que se puede acceder directamente en el código de ejecución).
En resumen, cuando no podemos llegar a un objeto desde ningún código ejecutable, el espacio que toma se puede reciclar. Tenga en cuenta que usamos la palabra "puede" porque el colector de basura determina si el espacio de memoria está reciclado. En general, el recolector de basura solo se ejecutará si se necesita más espacio de memoria o para evitar el desbordamiento de la memoria. Sin embargo, el programa puede salir sin desbordamiento de memoria, o incluso cuando no está cerca del desbordamiento de la memoria, por lo que puede no requerir recolección de basura en absoluto. En todos los métodos ejecutados actualmente, si todas las variables contienen referencias a un objeto, y a partir de estas variables, las referencias a este objeto no se pueden encontrar en todos los dominios o elementos de matriz a lo largo de la cadena de referencia, entonces decimos que el objeto es "inalcanzable".
El reciclaje de basura significa que nunca tenemos que preocuparnos por las referencias colgantes. En los sistemas donde los programadores pueden controlar directamente cuando se eliminan los objetos, los programadores pueden eliminar objetos a los que otros objetos aún están haciendo referencia. Si los programadores eliminan dichos objetos, las referencias que aún hacen referencia a los objetos eliminados se nacerán porque se refieren al silencio.
El sistema considera que es un espacio de memoria asignable (pero de hecho se ha lanzado el espacio). El sistema puede asignar este espacio asignable a nuevos objetos, de modo que las referencias originalmente apuntan al espacio en realidad dan como resultado objetos que son completamente diferentes de lo que esperaban. En este caso, pueden ocurrir desastres impredecibles cuando el programa usa valores almacenados en este espacio y los opera como objetos a los que no pertenecen. La recolección de basura resuelve el problema de colgar referencias para nosotros, porque todos los objetos a los que aún se hace referencia no se tratarán como recolección de basura, por lo que el espacio que ocupan no se pueden liberar. La recolección de basura también resuelve el problema de eliminar accidentalmente el mismo objeto varias veces: este problema también puede causar desastres. El reciclaje de los objetos de basura no requiere nuestra intervención, pero el reciclaje de basura ocupará una cierta cantidad de recursos del sistema. La creación y el reciclaje de grandes cantidades de objetos pueden interferir con aplicaciones críticas en el tiempo, por lo que al diseñar dichos sistemas, debemos tratar cuidadosamente la cantidad de objetos creados para reducir la cantidad de basura que se reciclará.
La recolección de basura no garantiza que la memoria siempre tenga espacio para crear nuevos objetos. Por ejemplo, si seguimos creando objetos y colocándolos en una lista, ya no podemos crear nuevos objetos cuando no hay suficiente espacio para crear nuevos objetos y no hay objetos no referenciados. Si mantenemos las referencias de la lista anteriores a los objetos que ya no son necesarios, entonces se producirá una fuga de memoria. La recolección de basura resuelve muchos (pero no todos) problemas de asignación de memoria.
Interactuar con el recolector de basura
Aunque el lenguaje Java en sí no tiene ninguna forma explícita de deshacerse de los objetos inactivos, aún podemos encontrar objetos que ya no se usan llamando directamente al colector de basura. Algunos métodos convenientes en la clase de tiempo de ejecución y la clase de sistema nos permiten llamar al recolector de basura, solicitar ejecutar todos los finalizadores que se ejecutarán o ver el estado de memoria actual:
.Public Void GC Q: Este método le pide a la máquina virtual Java que gaste objetos de reciclaje de energía que ya no se usan para que pueda reutilizar la memoria ocupada por estos objetos.
.Public Void RunFinalization (): Este método le pide a la máquina virtual Java que gaste energía ejecutando los siguientes finalizadores: objetos que se han encontrado inalcanzables pero cuyo finalizador aún no se ha ejecutado.
"Public Long Freedom (): devuelve el número estimado de bytes disponibles en la memoria del sistema.
・ Memoria total de Long Public (): Devuelve el número total de bytes en la memoria del sistema.
.Public Long MaxMemoryO: Devuelve el número máximo de bytes de memoria del sistema disponible para la máquina virtual Java. Si el sistema operativo no tiene restricciones de uso de memoria en Java Virtual Machines, Long. El valor máximo será devuelto. No hay ningún método en Java para establecer la memoria máxima del sistema. Por lo general, Java Virtual Machines establece este valor a través de la línea de comandos u otras opciones de configuración.
Para llamar al método anterior, necesitamos obtener una referencia al objeto de tiempo de ejecución actual a través del método estático tiempo de ejecución.getRuntime. La clase System admite los métodos estáticos de GC y RunFinalización, que llamará a los métodos correspondientes en el objeto RUTT-IM actual; En otras palabras, System.gc () es equivalente a runtime.getRuntime (). GC () métodos.
Al llamar al método Runtime.gc (), el recolector de basura puede no liberar ninguna memoria adicional, porque puede que no haya basura para reciclarse, y no todos los recolectores de basura pueden descubrir objetos reciclables a pedido. Por lo tanto, llamar al recolector de basura puede no tener ningún efecto. Sin embargo, es deseable llamar al método Runtime.gc () antes de crear una gran cantidad de objetos, especialmente en aplicaciones de tiempo crítico donde la sobrecarga de recolección de basura puede afectarlo. Hay dos beneficios potenciales para ejecutarlo: el primero es que podemos obtener tanta memoria como sea posible antes de ejecutar la aplicación, y el segundo es que podemos reducir la posibilidad de que el recolector de basura se ejecute durante la ejecución de tareas. El siguiente método libera activamente todo el espacio que se puede lanzar en tiempo de ejecución:
public static vo récordful1gc () {runtime rt = runtime.getRuntime (); long isFree = rt.freememory (); Long estaba libre; do {wasfree = isFree; rt.runfinalization (); rt.gc (); isfree dos rt.freememory (); } while (isFree> wasfree); }El método está constantemente en bucle, y el valor de Freememory continúa aumentando convocando continuamente los métodos de ranculación y GC. Cuando la cantidad de memoria libre ya no aumenta, el bucle del método termina.
Por lo general, no necesitamos llamar al método de finalización de la ranura porque el método de finalización se llama asincrónicamente por el recolector de basura. En algunos casos, por ejemplo, cuando se agota un recurso que puede reciclar el método finalizado, será útil aplicar tantas terminaciones como sea posible llamando a la finalización de ejecución. Pero recuerde que no podemos garantizar que cualquier objeto que espera a ser terminado esté utilizando este recurso, por lo que la finalización de la runnización puede no tener ningún efecto.
El método FullGC parece demasiado radical para la mayoría de las aplicaciones. En casos especiales en los que se requiere recolección de basura, incluso si no toda la basura disponible es recolectada por una sola llamada al método System.GC, es la gran mayoría. Por lo tanto, las llamadas repetidas reducirán la tasa de salida de la recolección de basura, y en muchos sistemas, estas llamadas repetidas no tienen salidas.