Нужно ли явно вызывать System.exit () в приложении Webstart? - PullRequest
8 голосов
/ 17 октября 2008

Недавно я конвертировал приложение Swing в Webstart. Процесс был довольно простым, но я обнаружил, что после закрытия всех окон JVM моего приложения не завершается. Дамп потока показал, что есть пара потоков, не являющихся демонами, в частности, Swing EDT, AWT и несколько потоков, связанных с веб-сайтами.

Фактическая используемая стратегия состоит в том, что каждое окно увеличивает счетчик при его создании и уменьшает его при закрытии. Операция закрытия по умолчанию - DISPOSE_ON_CLOSE. Когда счетчик достигает нуля, я останавливаю все пулы потоков и освобождаю все ресурсы JNI.

Когда я запустил приложение из bat-файла (те же JAR-файлы), оно нормально завершилось, когда все окна были закрыты, поэтому я решил, что проблема связана с Webstart.

Теперь вопросы:

  1. Кто-нибудь может сказать мне, что именно происходит? Почему Webstart оставляет зомби-JVM?
  2. Есть ли способ явного освобождения ресурсов Webstart без остановки JVM?
  3. У меня всегда было мнение, что вызов System.exit () поощряет небрежную практику не высвобождать ваши ресурсы и полагаться на то, что ОС очищается после вас (что может привести к неприятным сюрпризам, если вы повторно используете код позже) ... я что-то упустил?

См. Также дополнительный вопрос , чтобы узнать, было ли приложение запущено Webstart.

Ответы [ 5 ]

6 голосов
/ 17 октября 2008

Из-за ошибок в WebStart, да. WebStart запускает «безопасный поток» для своих собственных целей, который взаимодействует с EDT. Этот SecureThread предотвращает автоматическое завершение Java-процесса, которое можно ожидать, когда все окна и ресурсы AWT расположены.

Для получения дополнительной информации см. http://www.pushing -pixels.org /? P = 232

1 голос
/ 17 октября 2008

AWT EDT обычно является виновником. Уже несколько лет у него есть логика выключения, когда нет нераспределенных окон. Однако периодически возникают проблемы с утечками, в том числе в рамках реализации AWT и Swing. Поэтому я настоятельно рекомендую использовать System.exit в рабочих выпусках (возможно, вы захотите оставить его для некоторого тестирования для обнаружения утечек).

Поток WebStart должен быть демоном, если не отображаются системные окна (консоли, службы javax.jnlp и другие диалоги).

0 голосов
/ 03 марта 2009

У меня такая же проблема с запуском через Интернет. Если я отключаю консоль Java, процесс не зависает. Любой известный идентификатор ошибки от Sun?

0 голосов
/ 17 февраля 2009

Подумайте о подключении с помощью jconsole и посмотрите, что делает JVM.

0 голосов
/ 17 октября 2008

Webstart запускает окно консоли (вы можете отключить это). Окно консоли используется для просмотра stdout / err процесса веб-запуска, а также для элементарного журнала / отладки, но имеет побочный эффект от создания окна AWT / Swing верхнего уровня. Поскольку AWT / EDT заканчивается только тогда, когда расположено окно LAST, окно консоли задерживает ваше приложение. Вам, вероятно, следует вызвать System.exit (), чтобы быть на 100% уверенным, что ваше приложение завершает работу (если вы не можете гарантировать определенную конфигурацию клиента, консоль веб-запуска отключена)

...