Когда крюки выключения ломаются плохо

Если я добавлю хук завершения работы моей Java-программы следующим образом:

public class MyShutdownHook implements Runnable
{
    @Override
    public void run()
    {
        // Stuff I want executed anytime
        // the program, Java, or the OS exits normally,
        // crashes, or terminates unexpectedly for any reason.
    }
}

// The in another method...
Runtime.getRuntime().addShutdownHook(new MyShutdownHook());

... тогда бывают ли ситуации, когда это run() метод не будет выполняться, когда программа /Java/OS завершается нормально, аварийно завершает работу или завершается? Если так, то какие ситуации могли бы обойти Runtime отключить крючок, а почему?

5 ответов

Решение
  • Если процесс завершен, отключение не будет выполнено.

  • Если процесс завершается сбоем, отключение не будет выполнено.

  • Если у вас есть служба Windows, и завершение работы завершается, перехват завершается.

Если вы вытащите вилку из задней части компьютера, то отключающий крюк не сработает. Другие ситуации включают в себя:

  • Процесс завершается на POSIX OS с помощью SIGKILL (-9).
  • Точно так же, если вы решите прекратить "не отвечающий" процесс под Windows, завершающий хук может не завершиться.

В любое время, когда JVM может выйти изящно, запускается крюк отключения. Он не запускается, если:

  • JVM падает. (В зависимости от того, как / когда он выходит из строя, крючок все еще может работать, но никаких гарантий не делается)
  • JVM получает SIGKILL или аналогичный и немедленно останавливается ОС

Они запускаются, только если процесс "нормально выключается". Если процесс принудительно завершается из-за операционной системы или происходит сбой из-за проблем с ресурсами (например, из-за нехватки памяти), перехватчики завершения не будут вызываться.

Когда вы делаете Runtime.getRuntime().halt() JVM или когда ОС убивает процесс, не позволяя ему выполнить какую-либо очистку, также, когда у вас есть eclipse, завершите программу (при запуске ее в eclipse)

Другие вопросы по тегам