博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JVM关闭和Hook钩子
阅读量:3963 次
发布时间:2019-05-24

本文共 1766 字,大约阅读时间需要 5 分钟。

一、了解一下JVM关闭

通常而言,对于JVM的关闭我们很少去关注,但是了解JVM的关闭能帮我们在JVM关闭时做一些合理的事情。首先JVM的关闭方式可以分为一下几种:

1)程序正常退出

2)使用System.exit()
3)终端使用Ctrl+C触发的中断
4)系统关闭
5)使用Kill pid命令干掉进程
6)子线程异常对其他子线程、主线程以及hook都不影响;主线程异常也一样;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/

你可能感兴趣的文章
awk 精萃
查看>>
awk 简介
查看>>
awk 调用方式
查看>>
awk 注释
查看>>
awk 命令分隔符
查看>>
awk 变量
查看>>
awk 数组
查看>>
如何写出高效的SQL
查看>>
awk 运算符
查看>>
awk 控制结构
查看>>
awk 格式化输出
查看>>
awk 正则表达式
查看>>
awk 函数
查看>>
awk 向命令传递参数
查看>>
awk I/O
查看>>
grep 精萃
查看>>
java switch语句
查看>>
java try-with-resources 语句
查看>>
DB2 行转列
查看>>
DB2 认证路线图
查看>>