Нужно ли явно вызывать System.exit () в приложении Webstart?

StackOverflow https://stackoverflow.com/questions/212009

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

    Это было полезно?

    Решение

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

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

    Другие советы

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

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top