Недавно я конвертировал приложение Swing в Webstart. Процесс был довольно простым, но я обнаружил, что после закрытия всех окон JVM моего приложения не завершается. Дамп потока показал, что есть пара потоков, не являющихся демонами, в частности, Swing EDT, AWT и несколько потоков, связанных с веб-сайтами.
Фактическая используемая стратегия состоит в том, что каждое окно увеличивает счетчик при его создании и уменьшает его при закрытии. Операция закрытия по умолчанию - DISPOSE_ON_CLOSE. Когда счетчик достигает нуля, я останавливаю все пулы потоков и освобождаю все ресурсы JNI.
Когда я запустил приложение из bat-файла (те же JAR-файлы), оно нормально завершилось, когда все окна были закрыты, поэтому я решил, что проблема связана с Webstart.
Теперь вопросы:
- Кто-нибудь может сказать мне, что именно происходит? Почему Webstart оставляет зомби-JVM?
- Есть ли способ явного освобождения ресурсов Webstart без остановки JVM?
- У меня всегда было мнение, что вызов System.exit () поощряет небрежную практику не высвобождать ваши ресурсы и полагаться на то, что ОС очищается после вас (что может привести к неприятным сюрпризам, если вы повторно используете код позже) ... я что-то упустил?
См. Также дополнительный вопрос , чтобы узнать, было ли приложение запущено Webstart.