Как я могу понять, почему мое Java-приложение продолжает работать после выхода? - PullRequest
0 голосов
/ 19 мая 2018

Я занимаюсь разработкой настольного Java-приложения для Windows и пытаюсь реализовать Windows Restart Manager.Я успешно получаю сообщения Windows для выхода из приложения, и когда я отправляю их вручную, оно просто работает, и приложение закрывается.

Когда я делаю это как часть процесса удаления, процедура выключения в моемприложение запускается, и я даже вижу, что оно вызывает System.exit(0), но даже после этого есть процесс, который не останавливается.Мое Java-приложение упаковано в исполняемый файл, используя launch4j, на случай, если это уместно.

То, как я знаю, вызывается System.exit(0), заключается в том, что я записываю отладочную информацию в файл и распечатываю System.exit(0) скоро будет вызов, и я вижу, что приложение завершается успешно или не удается правильно завершить работу.

Используя Process Explorer, я вижу подпроцесс javaw.exe, и когда происходит процедура выхода,уходит, но родительский процесс остается.Пока работает, это выглядит так:

enter image description here

и после неудачного выхода выглядит так:

enter image description here

Если к процессу подключен удаленный отладчик, на этом этапе отладчик отключается.

Что может быть причиной этого?

Я почти уверен, что это ошибка в launch4j, поэтому я сообщил об этом здесь: https://sourceforge.net/p/launch4j/bugs/185/

1 Ответ

0 голосов
/ 19 мая 2018

Может быть, у вас есть ожидающие ShutdownHook-ы, которые еще не завершены?Вы можете отладить вызов (java) на java.lang.ApplicationShutdownHooks.runHooks(), так что вы также найдете, какие хуки были добавлены оболочкой.

Чтобы отладить ваше упакованное приложение, вам нужно отредактировать вас launch4j.xml файл, добавив

  <jre>
    ...
    <opt>-Xdebug</opt>
    <opt>-Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=y</opt>
  </jre>

Затем создайте другую версию exe-файла и запустите ее.Встроенная JVM будет работать с настройками отладки, поэтому она будет ждать удаленного отладчика.

EDIT На последнем снимке экрана мы видим, что JVM завершила работу;так что нет подвешенных крючков.

...