Eu tenho que chamar explicitamente System.exit () em um aplicativo Webstart?
-
03-07-2019 - |
Pergunta
Recentemente convertido uma aplicação Swing para Webstart. O processo foi bastante simples, mas eu achei que depois que eu fechar todas as janelas, JVM do meu aplicativo não terminar. O despejo de rosca mostrou que há um par de fios não-daemon, nomeadamente do balanço EDT, AWT e um par de tópicos relacionados websart.
A estratégia real usado é que cada janela incrementa um contador quando ele é criado e diminui um quando ele é fechado. A operação padrão perto é DISPOSE_ON_CLOSE. Wen o contador chegar a zero, eu paro todos threadpools e liberar todos os recursos JNI.
Quando lancei a aplicação de um arquivo bat (mesmos JARs), que terminou bem quando todas as janelas estavam fechadas, então achei que o problema tem algo a ver com Webstart.
Agora as perguntas:
- Alguém pode me dizer o que exatamente está acontecendo? Por que Webstart deixar JVMs de zumbis?
- Existe uma maneira de liberar os recursos Webstart explicitamente sem interromper o JVM?
- Sempre tive a opinião de que chamando System.exit () incentiva a prática malfeita de não liberar seus recursos e contando com o OS para limpar depois de você (o que pode levar a surpresas desagradáveis ??se você reutilizar o código mais tarde) ... estou faltando alguma coisa?
Veja também o followup questão para detectar se o aplicativo foi lançado pela Webstart.
Solução
Por causa de erros no WebStart, sim. WebStart inicia-se um "thread seguro" para seu próprio fins que interage com o EDT. Este SecureThread impede a resolução automática do um processo de Java seria de esperar quando todas as janelas e recursos AWT são eliminados.
Para obter mais informações, consulte http://www.pushing-pixels.org/?p = 232
Outras dicas
A AWT EDT é geralmente o culpado. Há já alguns anos que tem tido alguma lógica para desligar quando não há janelas undisposed. No entanto, existem problemas recorrentes com vazamentos, incluindo no âmbito da implementação do AWT e Swing. Portanto, eu sugiro fortemente usando System.exit em versões de produção (que você pode possivelmente querer deixá-lo fora para alguns testes para detectar vazamentos).
O fio WebStart devem ser todos daemon quando não há janelas do sistema (consola, serviços javax.jnlp e outros diálogos) que mostram.
Webstart começa a janela Console (você pode ser capaz de desativar isso). A janela do console é usado para ver stdout / err do processo webstart, bem como rudimentar log / debug, mas tem o efeito colateral de criado uma janela AWT / Swing de nível superior. Desde o AWT / EDT só termina quando a última janela é disposto, a janela do console está segurando sua aplicação. Você provavelmente deve chamar System.exit () para ser 100% de certeza seus sai do aplicativo (a menos que você pode gurantee uma certa configuração do cliente, consola webstart desligado)
Considere anexar com jconsole e obter uma olhada no que a JVM está fazendo.
I experimentar o mesmo problema com início web. Se eu desligar o Java Console, o processo não desligue. Qualquer ID de bug conhecido da Sun?