java - example - garbage collector python
Recolección de basura de Java (7)
Java llama automáticamente al recolector de basura, entonces ¿por qué necesitamos llamadas manuales para la recolección de basura? Cuándo debería usar System.gc ()
Java llama automáticamente al recolector de basura, entonces ¿por qué necesitamos llamadas manuales para la recolección de basura?
No los necesitamos De hecho, en la mayoría de los casos, llamar a System.gc()
es perjudicial para el rendimiento de la aplicación . Consulte mi respuesta a "Por qué es una mala práctica llamar al sistema gc" para obtener una explicación detallada.
Cuándo debería usar System.gc ()
Si la aplicación sabe que entra en una fase en la que no tiene nada más que hacer Y es poco probable que el usuario System.gc()
una recolección de basura, entonces quizás esté bien llamar a System.gc()
para evitar que el usuario experimente pausas de GC. en el futuro.
Las desventajas incluyen:
- Llamar a
System.gc()
normalmente desencadena un GC completo que lleva mucho más tiempo que un GC del ''nuevo espacio''. - Al forzar el GC, está causando que la JVM use ciclos de CPU adicionales, etc. que pueden interferir potencialmente con otras cosas que el usuario está haciendo en su máquina.
(También puede haber razones legítimas para llamar a System.gc()
en pruebas unitarias y durante la depuración del sistema).
El proceso de recolección de basura no está bajo el control del usuario. Por lo tanto, no tiene sentido llamar a System.gc();
explícitamente. Todo depende de la JVM.
Pocos días atrás, había hecho exactamente la misma pregunta: [Here] .
De hecho, muchas preguntas se relacionan con llamar a System.gc();
explícitamente ya se han preguntado y respondido aquí. Llamando a System.gc();
explícitamente siempre se considera como una mala habilidad de programación, aunque no hará ningún daño.
Aquí están los pocos enlaces a los que debería acceder. Definitivamente aclarará su duda.
PD: Por cierto, deberías tomar el esfuerzo extra para resolver preguntas similares de antes de publicar tus dudas.
La JVM siempre llama al recolector de basura cuando no hay suficiente memoria para asignar nuevos objetos al montón. Al llamar al recolector de basura, sigue las normas Stop the World y para esto llama al método System.gc()
.
Recuerde también que la JVM también ejecuta subprocesos gc paralelos para eliminar objetos no utilizados de la memoria. Entonces, todo y cada minuto JVM mantiene la memoria dinámica y siempre trata de no sobrecargarla. Por lo tanto, no hay ningún requisito para llamar explícitamente a System.gc()
o al método Runtime.gc()
.
Si desea más información al respecto, puede obtener here la información relevante.
No es necesario llamar a System.gc()
o Runtime.getRuntime().gc()
. La JVM controla internamente la recolección de basura si encuentra que se está quedando sin memoria.
No es necesario llamar a la recolección de basura explícitamente y llamar a System.gc()
es solo una sugerencia , la JVM puede ignorar su sugerencia.
Los únicos usos prácticos que puedo pensar es
- Durante la depuración, forzar una colección puede exponer una pérdida de memoria
- Si el programa pasa por ciclos predecibles de cómputo intenso sin computación (como un juego por turnos), durante el período de no computación, la CPU podría utilizarse para una recolección de basura sugerida para evitar la trepidación durante las porciones de computación intensas.
System.gc () es solo una sugerencia. Pero tiene sentido en algunas situaciones.
Supongamos que tiene clase MyClass, y se está preguntando cuánta memoria necesita una instancia. Lo que puedes hacer es esto (más o menos):
MyClass [] objects= new MyClass[100000];
System.gc();
long memoryNow = Runtime.getRuntime().freeMemory();
for (int i = 0; i < 100000; i ++) {
objects[i] = new MyClass();
}
System.gc();
long memoryLater = Runtime.getRuntime().freeMemory();
int objectSize = (int)((memoryLater - memoryNow) / 100000);
Hay otros casos similares que he encontrado que System.gc () es útil.
Un aspecto aún no mencionado es que algunos tipos de objetos pueden solicitar a las entidades ajenas a ellos que hagan cosas en su nombre (por ejemplo, darles acceso exclusivo a un recurso no fungible como un archivo), en detrimento de otras entidades. Cuando se realiza una recolección de basura, el sistema no solo liberará la memoria que anteriormente estaba ocupada por objetos inalcanzables, sino que también llamará a finalize
sobre los objetos que nota que han sido abandonados, permitiendo así que dichos objetos notifiquen a las entidades externas que sus servicios ya no son necesarios. Es completamente posible que un programa llegue a un estado donde hay mucha memoria, pero un recurso necesario no está disponible porque un objeto ha recibido acceso exclusivo y desde entonces ha sido abandonado sin liberarlo. Ocasionar que el recolector de basura se ejecute en una situación de este tipo a veces puede liberar el recurso necesario.