2008-10-17 6 views
8

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

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

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

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

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

См. Также followup question для определения того, было ли приложение запущено через Webstart.

ответ

6

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

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

+0

Спасибо, ссылка объясняет все, что я хотел знать. Есть ли какой-нибудь билет на парад, который я могу проголосовать? (если да, отправьте ответ в виде комментария к основному вопросу) – ddimitrov 2008-10-18 02:20:13

0

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

+0

nope. конфигурация по умолчанию не является консольным окном.никаких окон на экране вообще (пустая панель задач, alt + esc ничего не делает) – ddimitrov 2008-10-17 13:30:02

1

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

Тема WebStart должна быть демон, если нет системных окон (консолей, javax.jnlp-сервисов и других диалогов).

+0

Можете ли вы привести пример утечки в Swing (т. е. выделение ресурса, который не может быть выпущен с использованием общедоступного API)? – ddimitrov 2008-10-17 13:28:08

0

Рассмотрим прикрепление с JConsole и взглянуть на то, что делает JVM.

0

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

Смежные вопросы