本文共 1766 字,大约阅读时间需要 5 分钟。
通常而言,对于JVM的关闭我们很少去关注,但是了解JVM的关闭能帮我们在JVM关闭时做一些合理的事情。首先JVM的关闭方式可以分为一下几种:
1)程序正常退出
2)使用System.exit() 3)终端使用Ctrl+C触发的中断 4)系统关闭 5)使用Kill pid命令干掉进程 6)子线程异常对其他子线程、主线程以及hook都不影响;主线程异常也一样;hook线程中出现异常,则失效
关闭钩子本质上是一个线程(也称为Hook线程),用来监听JVM的关闭。通过使用Runtime的addShutdownHook(Thread hook)可以向JVM注册一个关闭钩子。Hook线程在JVM 正常关闭才会执行,在强制关闭时不会执行。
@Test public void testHook() { Thread jvmClear = new Thread(new Runnable() { @Override public void run() { System.out.println("jvm关闭前执行,可以进行内存清理"); } }, "JvmClear"); //设置shutdownHook Runtime.getRuntime().addShutdownHook(jvmClear); Thread thread1 = new Thread(new Runnable(){ @Override public void run() { System.out.println("执行线程1"); } }, "job1"); Thread thread2 = new Thread(new Runnable() { @Override public void run() { System.out.println("执行线程2"); } }, "job2"); //执行线程1和2 thread1.start(); thread2.start(); }
1、内存管理
在某些情况下,我们需要根据当前内存的使用情况,人为的调用System.gc()来尝试回收堆内存中失效的对象。此时就可以用到Runtime中的totalMemory()、freeMemory()等方法public void autoClean(){ Runtime rt=Runtime.getRumtime(); if((rt.totalMemory()-rt.freeMemory())/(double)rt.maxMemory()>0.90){ //内存利用率到90%以上时,执行相关清理工作 } }
2、执行命令,使用runtime的exec
方法,在单独进程中
class Test { public static void main(String args[]){ Runtime r = Runtime.getRuntime(); Process p = null; try{ p = r.exec("notepad"); } catch (Exception e) { } } }
3、临时文件清理
参考文章
转载地址:http://dtgzi.baihongyu.com/