Runtime.getRuntime().addShutdownHook(shutdownHook);java
用途jvm
1應用程序正常退出,在退出時執行特定的業務邏輯,或者關閉資源等操做。spa
2虛擬機非正常退出,好比用戶按下ctrl+c、OutofMemory宕機、操做系統關閉等。在退出時執行必要的挽救措施。操作系統
public class JVMHook {線程
public static void start(){
System.out.println("The JVM is started");
Runtime.getRuntime().addShutdownHook(new Thread(){
public void run(){
try{
//do something
System.out.println("The JVM Hook is execute");
}catch (Exception e) {
e.printStackTrace();
}
}
});
}
public static void main(String[] args) {
start();
System.out.println("The Application is doing something");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}對象
輸出結果:內存
The JVM is started
The Application is doing something
The JVM Hook is execute資源
最後一條是三秒後JVM關閉時候輸出的。get
輸出結果:虛擬機
The JVM is started
The Application is doing something
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.java.seven.JVMHook.main(JVMHook.java:24)
The JVM Hook is execute
在OutOfMemoryError的時候能夠作一些補救措施。
建議:同一個JVM最好只使用一個關閉鉤子,而不是每一個服務都使用一個不一樣的關閉鉤子,使用多個關閉鉤子可能會出現當前這個鉤子所要依賴的服務可能已經被另一個關閉鉤子關閉了。爲了不這種狀況,建議關閉操做在單個線程中串行執行,從而避免了再關閉操做之間出現競態條件或者死鎖等問題。