java - Llamará a System.exit(0); desde un objeto fuera de la colección principal de basura?
garbage-collection exit-code (3)
System.exit () es una función estática, por lo tanto, no importa dónde lo llame. Los efectos son los mismos que terminan la Máquina Virtual de Java. Todos los recursos utilizados por la JVM al finalizar se devuelven al sistema operativo.
Fuente: http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#exit(int)
Planeo usar un objeto que es llamado por mi método principal para salir de todo el programa. El objeto tiene un método que solo ejecuta System.exit(0).
Mi pregunta es, ¿esto es algo seguro de hacer? Si ejecuto System.exit(0)
desde otro objeto, ¿la recolección de elementos no utilizados aún eliminará todo el programa de la memoria, o tendré problemas para limpiar la clase de llamada de la memoria? Mi opinión es que, o bien la JVM se terminará, la clase de llamada se recolectará de forma incorrecta o que tendré problemas para limpiar la clase de llamada de la memoria ya que el marco de la pila del objeto está por encima del marco de la pila principal. Es principalmente una cuestión de mí que aún no sé lo suficiente sobre Java ... ¡Gracias por cualquier ayuda!
Usar System.exit (0) vaciará toda la aplicación de la pila y el montón. Use VisualVM mientras ejecuta su programa para confirmar esto. No puedo acceder a él, pero tengo una aplicación que aumenta el uso de memoria por unos pocos GB. Puse una declaración System.exit () en uno de los objetos y vi que se liberaba toda la memoria.
System.exit(any int)
terminará la aplicación. La memoria tanto nativa como de pila se liberaría hasta el sistema operativo.
Esto terminaría el proceso "java". En Linux, hazlo
ps -eaf | grep java
para ver el proceso después de la llamada a System.exit y verá que ha salido y no hay rastro de él. Esto implica que este proceso no se está ejecutando y todos los recursos: la memoria, la CPU asignada a ella son reclamados por el sistema operativo.
En el frente del GC, una aclaración, el GC también es una parte integral de cualquier aplicación (proceso) de Java y también terminaría con él. System.exit no proporcionará la ejecución de GC o la limpieza.
Si desea una limpieza, permita un gancho de apagado y System.exit () en este caso invocaría el gancho de cierre permitiendo la limpieza, como el apagado de hilos, etc.