Недавно я преобразовал приложение Swing в Webstart. Процесс был довольно прост, но я обнаружил, что после закрытия всех окон, JVM моего приложения не прекращается. Дамп потока показал, что есть несколько потоков не-демона, особенно EDT от Swing, AWT и несколько связанных с websart потоков.Должен ли я явно вызывать System.exit() в приложении Webstart?
Используемая фактическая стратегия заключается в том, что каждое окно увеличивает счетчик, когда он создан, и уменьшает его, когда он закрыт. Операция закрытия по умолчанию - DISPOSE_ON_CLOSE. Вэнь счетчик достигает нуля, я останавливаю все пулы потоков и освобождаю все ресурсы JNI.
Когда я запустил приложение из файла bat (такие же JAR-файлы), он прекратился, когда все окна были закрыты, поэтому я решил, что проблема имеет какое-то отношение к Webstart.
Теперь вопросы:
- Может кто-нибудь сказать мне, что именно происходит? Почему Webstart оставляет JVM зомби?
- Есть ли способ освободить ресурсы Webstart явно, не останавливая JVM?
- У меня всегда было мнение, что вызов System.exit() поощряет неряшливую практику не выпускать ваши ресурсы и полагаться на ОС для очистки после вас (что может привести к неприятным неожиданностям, если вы повторно используете код позже) ... я что-то упускаю?
См. Также followup question для определения того, было ли приложение запущено через Webstart.
Спасибо, ссылка объясняет все, что я хотел знать. Есть ли какой-нибудь билет на парад, который я могу проголосовать? (если да, отправьте ответ в виде комментария к основному вопросу) – ddimitrov 2008-10-18 02:20:13