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:

  1. Alguém pode me dizer o que exatamente está acontecendo? Por que Webstart deixar JVMs de zumbis?
  2. Existe uma maneira de liberar os recursos Webstart explicitamente sem interromper o JVM?
  3. 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.

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top