Я планирую использовать объект, который вызывается моим основным методом для выхода из всей программы. У объекта есть метод, который просто запускает System.exit(0).
Мой вопрос: безопасно ли это? Если я запущу System.exit(0)
из другого объекта, будет ли сборщик мусора по-прежнему очищать всю программу из памяти, или у меня возникнут проблемы с очисткой вызывающего класса из памяти? Я думаю, что либо поскольку JVM будет завершена , вызывающий класс будет удален сборщиком мусора или что у меня могут возникнуть проблемы с очисткой вызывающего класса из памяти, поскольку кадр стека объекта находится над кадром основного стека. В основном это связано с тем, что я еще недостаточно знаю Java... Спасибо за любую помощь!
Будет вызывать System.exit(0); из объекта за пределами основной сборки мусора?
Ответы (3)
System.exit() — это статическая функция, поэтому не имеет значения, где вы ее вызываете. Эффекты те же, что и при завершении виртуальной машины Java. Любые ресурсы, используемые JVM после завершения, возвращаются ОС.
Источник: http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#exit(int)
System.exit(any int)
закроет приложение. Память, как родная, так и куча, будет освобождена для операционной системы.
Это завершит процесс "java". В линуксе сделайте
пс-эаф | grep java
чтобы просмотреть процесс после вызова System.exit, и вы увидите, что он завершился и его следов не осталось. Это означает, что этот процесс не запущен и любые ресурсы: память, ЦП, назначенные ему, востребованы ОС.
На фронте GC пояснение: GC также является неотъемлемой частью любого Java-приложения (процесса) и также завершается с ним. System.exit не обеспечивает запуск сборщика мусора или какую-либо очистку.
Если вам нужна очистка, разрешите хук выключения, и System.exit() в этом случае вызовет хук выключения, позволяющий выполнять очистку, например закрытие потоков и т. д.
Использование System.exit(0) удалит все приложение из стека и кучи. Используйте VisualVM во время работы программы, чтобы убедиться в этом. Я не могу добраться до него, но у меня есть приложение, которое увеличивает использование памяти до нескольких ГБ. Я поместил оператор System.exit() в один из объектов и увидел, что вся память была освобождена.