Java выйти из программы без выхода из JVM - PullRequest
1 голос
/ 18 апреля 2011

Я хочу выйти из процесса Java и освободить все ресурсы, прежде чем он завершит свою нормальную работу, если выполнено определенное условие. Однако я не хочу выходить из JVM, так как у меня одновременно работают другие Java-программы. return; выполняет вышеуказанное или есть лучший способ сделать это?

Спасибо.

Ответы [ 5 ]

9 голосов
/ 18 апреля 2011

Существует один процесс JVM на каждое запущенное приложение Java. Если вы выходите из этого приложения, JVM процесса закрывается. Однако это не влияет на другие процессы Java.

4 голосов
/ 18 апреля 2011

Вам необходимо понять механизм JVM и уточнить терминологию.

Давайте используем следующие термины в качестве базовых данных для терминологии.

  • Потоки - это подразделения одновременно обрабатываемых потоковвнутри процесса.

  • Процесс - это поток уровня ОС.ОС управляет процессами.Процесс завершается путем отправки сигнала завершения руководству ОС.Сигнал может быть отправлен самим процессом или другим процессом, имеющим соответствующую привилегию.

  • Внутри процесса вы можете создавать потоки уровня процесса.Потоки уровня процесса обычно облегчаются управлением процессом ОС, но они инициируются процессом и завершаются процессом.Таким образом, потоки уровня процесса - это не то же самое, что процессы.

  • Приложение - это набор систем, программ и / или потоков, которые взаимодействуют в различных формах.Программа или процесс в приложении могут завершаться без завершения всего приложения.

В контексте терминологии JVM программа может быть одной из следующих.

  • Программа запускается для каждого процесса JVM.Каждая программа использует один процесс JVM и вызывается путем указания пути к классу байтового кода Java и указания главной точки входа, найденной в пути к классам.Когда вы завершаете работу Java-программы, весь процесс jvm, запустивший эту программу, также завершается.

  • Программа запускается для каждого потока уровня процесса.Например, приложение, запущенное на сервере Tomcat или JEE, запускается как поток в процессе JEE.Процесс JEE сам по себе является программой, использующей один процесс JVM.Когда вы завершаете прикладную программу, процесс JEE не прерывается.

Вы можете инициировать потоки уровня процесса в Java-программе.Вы можете написать код, который завершает поток, но не прерывает процесс (если только он не является последним и единственным запущенным потоком в процессе).Сборка мусора JVM позаботится об освобождении ресурсов, и вам не нужно самостоятельно освобождать ресурсы после завершения потока уровня процесса.

Приведенный выше ответ упрощен для понимания.Пожалуйста, ознакомьтесь с дизайном ОС и многопоточностью, чтобы облегчить понимание процессов и механизма JVM.

3 голосов
/ 18 апреля 2011

Если другие потоки, работающие одновременно, не являются потоками демона, оставление main не завершит работу виртуальной машины.Другие потоки продолжат работать.

Я полностью упустил этот момент.

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

Если вы запускаете их с помощью одного сценария или чего-то еще, в зависимости от того, как он написан, что-то еще может убить другие процессы.Без точной информации о том, как вы запускаете эти приложения, невозможно сказать, что происходит.

2 голосов
/ 18 апреля 2011

@ aix ответ, вероятно, по поводу вашего вопроса.Каждый раз, когда вы запускаете команду java (или эквивалентную), вы получаете другой экземпляр JVM.Вызов System.exit() в одном экземпляре JVM не приведет к завершению работы других экземпляров JVM.(Попробуйте и посмотрите!)

Можно создать структуру, в которой вы запускаете несколько программ в рамках одной JVM.Это действительно то, что вы делаете, когда запускаете «оболочку бобов».То же самое происходит, когда ваши "программы" - это службы (или веб-приложения, или как вы их называете), работающие в какой-то среде сервера приложений.

Плохая новость заключается в том, что если вы делаете такие вещи,Не совсем надежный способ заставить индивидуальную «программу» уйти.В частности, если программа не предназначена для совместной работы (например, если она не проверяет наличие прерываний), вам придется прибегнуть к УСТАРЕВШЕМУ методу Thread.stop() и друзьям.И эти методы могут иметь неприятные последствия для JVM и других программ, работающих в нем.

Теоретически, решение этой проблемы заключается в использовании изоляторов.К сожалению, я не думаю, что какие-либо основные JVM поддерживают Isolates.

0 голосов
/ 12 ноября 2017

Некоторые распространенные случаи использования, отвечающие таким требованиям, могут быть решены с помощью таких инструментов, как Nailgun или Drip.

Nailgun позволяет запускать несколько независимых программ командной строки, но все они происходят в одной JVM. Поэтому повторное время запуска JVM не должно быть выдержано. Если это выполнение будет взаимодействовать с глобальным состоянием, JVM со временем будет загрязнена, и все начнет разрушаться.

Drip будет использовать новую JVM для каждого выполнения, но всегда поддерживает предварительно созданную JVM с правильным путем к классам и опциями. Это менее эффективно, но может гарантировать правильность через изоляцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...