Будет вызывать System.exit(0); из объекта за пределами основной сборки мусора?

Я планирую использовать объект, который вызывается моим основным методом для выхода из всей программы. У объекта есть метод, который просто запускает System.exit(0). Мой вопрос: безопасно ли это? Если я запущу System.exit(0) из другого объекта, будет ли сборщик мусора по-прежнему очищать всю программу из памяти, или у меня возникнут проблемы с очисткой вызывающего класса из памяти? Я думаю, что либо поскольку JVM будет завершена , вызывающий класс будет удален сборщиком мусора или что у меня могут возникнуть проблемы с очисткой вызывающего класса из памяти, поскольку кадр стека объекта находится над кадром основного стека. В основном это связано с тем, что я еще недостаточно знаю Java... Спасибо за любую помощь!


person Paradox    schedule 04.11.2015    source источник
comment
Это останавливает весь jvm, поэтому я не знаю, о чем вы беспокоитесь? Если вы выключите компьютер, он не очистит оперативную память?   -  person Gaskoin    schedule 05.11.2015
comment
Итак, если бы у меня был другой класс, я сделал из него объект и вызвал System.exit(0); в этом объекте, тогда все в порядке?   -  person Paradox    schedule 05.11.2015
comment
Это не имеет ничего общего с внутренней работой Java. Процесс завершается, и все его ресурсы, включая память, освобождаются операционной системой.   -  person user207421    schedule 05.11.2015


Ответы (3)


System.exit() — это статическая функция, поэтому не имеет значения, где вы ее вызываете. Эффекты те же, что и при завершении виртуальной машины Java. Любые ресурсы, используемые JVM после завершения, возвращаются ОС.

Источник: http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#exit(int)

person Wesley    schedule 04.11.2015

System.exit(any int) закроет приложение. Память, как родная, так и куча, будет освобождена для операционной системы.

Это завершит процесс "java". В линуксе сделайте

пс-эаф | grep java

чтобы просмотреть процесс после вызова System.exit, и вы увидите, что он завершился и его следов не осталось. Это означает, что этот процесс не запущен и любые ресурсы: память, ЦП, назначенные ему, востребованы ОС.

На фронте GC пояснение: GC также является неотъемлемой частью любого Java-приложения (процесса) и также завершается с ним. System.exit не обеспечивает запуск сборщика мусора или какую-либо очистку.

Если вам нужна очистка, разрешите хук выключения, и System.exit() в этом случае вызовет хук выключения, позволяющий выполнять очистку, например закрытие потоков и т. д.

person Khanna111    schedule 04.11.2015

Использование System.exit(0) удалит все приложение из стека и кучи. Используйте VisualVM во время работы программы, чтобы убедиться в этом. Я не могу добраться до него, но у меня есть приложение, которое увеличивает использование памяти до нескольких ГБ. Я поместил оператор System.exit() в один из объектов и увидел, что вся память была освобождена.

person SWPhantom    schedule 04.11.2015
comment
Когда приложение завершает работу, его стек и куча перестают существовать. - person Andy Thomas; 05.11.2015