Рубрики

Завершение работы JVM в Java

Завершение работы — это специальная конструкция, которая позволяет разработчикам подключать фрагмент кода, который будет выполняться при завершении работы JVM. Это удобно в тех случаях, когда нам нужно выполнить специальные операции очистки в случае выключения виртуальной машины.

Обработка этого с использованием общих конструкций, таких как обеспечение того, чтобы мы вызывали специальную процедуру до выхода из приложения (вызов System.exit (0)), не будет работать в ситуациях, когда виртуальная машина выключается по внешней причине (например, запрос на удаление). из O / S), или из-за проблемы с ресурсами (нехватка памяти). Как мы скоро увидим, перехватчики завершения легко решают эту проблему, позволяя нам предоставить произвольный кодовый блок, который будет вызываться JVM при завершении работы.

С поверхности, используя крюк отключения прямо прямо вперед. Все, что нам нужно сделать, — это просто написать класс, который расширяет класс java.lang.Thread и предоставляет логику, которую мы хотим выполнить при завершении работы виртуальной машины, внутри открытого метода void run (). Затем мы регистрируем экземпляр этого класса в качестве перехватчика завершения работы виртуальной машины, вызывая метод Runtime.getRuntime (). AddShutdownHook (Thread). Если вам нужно удалить ранее зарегистрированный хук завершения работы, класс Runtime также предоставляет метод removeShutdownHook (Thread).

Например :

public class ShutDownHook

{

  public static void main(String[] args)

  {

  

    Runtime.getRuntime().addShutdownHook(new Thread()

    {

      public void run()

      {

        System.out.println("Shutdown Hook is running !");

      }

    });

    System.out.println("Application Terminating ...");

  }

}

Когда мы запустим приведенный выше код, вы увидите, что ловушка отключения вызывается JVM, когда он завершает выполнение основного метода.

Выход:

Application Terminating ...
Shutdown Hook is running !

Просто верно? Да, это так.

Несмотря на то, что довольно просто написать хук отключения, необходимо знать внутреннее устройство за хуками отключения, чтобы правильно их использовать. Поэтому в этой статье мы рассмотрим некоторые «ошибки», лежащие в основе конструкции крюка отключения.

1. В некоторых случаях крюки выключения могут не выполняться!
Первое, что нужно иметь в виду, это то, что не гарантируется, что отключающие крюки будут работать всегда. Если JVM падает из-за какой-то внутренней ошибки, он может потерпеть крах, не имея возможности выполнить одну инструкцию. Кроме того, если O / S подает сигнал SIGKILL (http://en.wikipedia.org/wiki/SIGKILL) (kill -9 в Unix / Linux) или TerminateProcess (Windows), то приложение должно быть немедленно завершено без делать даже в ожидании каких-либо действий по уборке. В дополнение к вышесказанному также возможно завершить работу JVM, не позволяя запускать обработчики завершения работы, вызвав метод Runtime.halt ().

Хуки завершения вызываются, когда приложение нормально завершается (когда завершаются все потоки или когда вызывается System.exit (0)). Кроме того, когда JVM завершает работу из-за внешних причин, таких как пользователь, запрашивающий завершение (Ctrl + C), SIGTERM выдается O / S (обычная команда kill, без -9), или когда операционная система закрывается вниз.

2. После запуска крюки отключения могут быть принудительно остановлены до завершения.
На самом деле это частный случай описанного выше случая. Хотя перехватчик запускает выполнение, его можно прервать до его завершения в таких случаях, как завершение работы операционной системы. В таких случаях O / S ожидает завершения процесса в течение заданного промежутка времени после того, как задан SIGTERM. Если процесс не завершается в течение этого срока, то O / S принудительно завершает процесс, выдавая SIGTERM (или аналоги в Windows). Так что возможно, что это происходит, когда перехватчик завершает свою работу на полпути.

Следовательно, рекомендуется следить за тем, чтобы крюки отключения были написаны осторожно, чтобы они быстро заканчивались и не вызывали таких ситуаций, как взаимоблокировки. Кроме того, в JavaDoc [1] специально упоминается, что не следует выполнять длинные вычисления или ждать операций ввода-вывода пользователя в ловушке завершения работы.

3. У нас может быть более одного крюка отключения, но порядок их выполнения не гарантируется.
Как вы, возможно, правильно догадались по имени метода метода addShutdownHook (вместо setShutdownHook), вы можете зарегистрировать несколько хуков завершения работы. Но порядок выполнения этих нескольких перехватчиков не гарантируется JVM. JVM может выполнять перехватчики отключения в любом произвольном порядке. Более того, JVM может выполнять все эти ловушки одновременно.

4. Мы не можем зарегистрировать / отменить регистрацию блокировок отключения в рамках блокировок отключения
Как только JVM инициирует последовательность выключения, ему не разрешается добавлять больше или удалять любые существующие ловушки выключения. Если это попытается, JVM генерирует исключение IllegalStateException.

5. После запуска последовательности выключения она может быть остановлена только Runtime.halt ().
Как только начинается последовательность выключения, только Runtime.halt () (которая принудительно завершает JVM) может остановить выполнение последовательности выключения (за исключением внешних воздействий, таких как SIGKILL). Это означает, что вызов System.exit () в Shutdown Hook не будет работать. На самом деле, если вы вызываете System.exit () в Shutdown Hook, виртуальная машина может застрять, и нам, возможно, придется принудительно завершить процесс.

6. Использование перехватчиков требует разрешения безопасности.
Если мы используем менеджеры безопасности Java, то код, который выполняет добавление / удаление перехватчиков завершения работы, должен иметь разрешение shutdownHooks во время выполнения. Если мы вызовем этот метод без разрешения в безопасной среде, то это приведет к SecurityException.

Ссылки :
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)

Эта статья предоставлена Сакет Кумар . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Завершение работы JVM в Java

0.00 (0%) 0 votes