`
a14
  • 浏览: 12013 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

jvm停止前的回调(转载)

 
阅读更多

在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码。Java中得ShutdownHook提供了比较好的方案。
  JDK在1.3之后提供了Java Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在以下几种场景被调用:

  • 1)程序正常退出
  • 2)使用System.exit()
  • 3)终端使用Ctrl+C触发的中断
  • 4)系统关闭
  • 5)使用Kill pid命令干掉进程

注:在使用kill -9 pid是不会JVM注册的钩子不会被调用。
在JDK中方法的声明:
public void addShutdownHook(Thread hook)
参数
hook -- 一个初始化但尚未启动的线程对象,注册到JVM钩子的运行代码。
异常
IllegalArgumentException -- 如果指定的钩已被注册,或如果它可以判定钩已经运行或已被运行
IllegalStateException -- 如果虚拟机已经是在关闭的过程中
SecurityException -- 如果存在安全管理器并且它拒绝的RuntimePermission(“shutdownHooks”)

代码示例:
使用Timer模拟一个工作线程,该线程重复工作十次,使用System.exit()退出,在清理现场代码CleanWorkThread 中,取消timer运行,并输出必要的日志信息。

复制代码

package com.amugua.test;

 

import org.slf4j.Logger;

 

import com.amugua.log.factory.LoggerFactory;

 

/**

 * TODO 类实现描述

 * @Company 杭州木瓜科技有限公司

 * @className: Test.java

 * @author liutao baiying@dianjia.io

 * @date 2017年9月4日 下午2:12:59

 */

public class WorkThread extends Thread {

 

    static final Logger LOGGER = LoggerFactory.getLogger(WorkThread.class);

 

    privateboolean     flag   = true;

 

    class ShutdownCallbackThread extends Thread {

        @Override

        public void run() {

            //            flag = false;

            LOGGER.error("hook");

            while (true) {

 

            }

        }//设置关闭筏值

    }

 

    @Override

    public void run() {

        //regist hook

        ShutdownCallbackThread hook = new ShutdownCallbackThread();

        Runtime.getRuntime().addShutdownHook(hook);

        //        while (flag) {

        //                   ....working;

        LOGGER.info("working");

        try {

            Thread.sleep(1000);

        } catch (InterruptedException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        LOGGER.info("working");

        //        }

    }

}

测试类的main:

 WorkThread aa = new WorkThread();

        aa.start();

        Thread.sleep(5000);

复制代码

 



运行后,可以模拟以上五种场景进行测试,只有kill -9 pid不会执行Hook里面的代码。

分享到:
评论

相关推荐

    JVM历史发展和内存回收笔记

    Java虚拟机(JVM)是Java程序运行的基础,它的历史发展和内存回收机制是Java开发者必须深入了解的关键领域。本文将详细探讨JVM的发展历程以及内存管理中的垃圾回收机制。 一、JVM的历史发展 1. **早期阶段**:1995...

    JVM GC垃圾回收.pdf

    JVM GC垃圾回收.pdf

    慢慢琢磨jvm 经典

    ### 深入解析JVM:Java虚拟机的精髓与挑战 #### JVM概览与重要性 JVM,即Java Virtual Machine(Java虚拟机),是Java程序员必须掌握的核心技术之一。初学者通常从简单的“HelloWorld”程序开始,逐渐接触更复杂的...

    Android JNI多线程编程回调JAVA函数

    - `JniCallBackDemo`可能是项目中的一个示例工程,包含了一个Java类,其中定义了需要被回调的接口,以及一个本地库,实现线程创建和回调逻辑。 - Java类中,`native`方法声明和`System.loadLibrary`加载本地库,...

    JVM常用垃圾回收器的特性与使用场景.md

    该文档总结了JVM主要的七种垃圾回收器特点与区别,分别描述了他们作用于堆内存的哪些区域,采用单线程还是多线程工作方式,在运行过程中是否需要暂停其他用户工作线程。是笔者对周志明老师的《深入理解java虚拟机》...

    jvm内存和垃圾回收.xmind

    自己总结的jvm中内存和垃圾回收的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合jvm的爱好者和学习者

    JNI层创建的线程中回调java方法

    因此,从本地线程回调Java方法需要特殊处理,因为这涉及到线程安全和JVM的同步问题。 在JNI中回调Java方法主要有两种方式: 1. **使用JNIEnv**:JNIEnv是一个指向一系列函数指针的结构体,它提供了在本地代码中...

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    本系列课程从JVM基础到高级实战,老师手把手教你如何进行JVM调优,思路清晰,没有废话,旨在挑战高薪。 课程亮点: 1、基于阿里arthas进行JVM调优; 2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路;...

    垃圾回收调优及JVM参数详解

    垃圾回收调优及JVM参数详解

    jdk,jvm源码

    Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。JDK(Java Development Kit)包含了开发和运行Java程序所需的所有工具,包括JVM。当我们谈论"jdk,jvm...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...

    JVM面试资料:JVM结构、JVM调优、四大垃圾回收算法、七大垃圾回收器

    JVM面试资料。 JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构; 四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel...

    JVM内存回收权威指南

    JVM内存回收最全的手册书籍,详细介绍了各种内存回收算法,是Java程序员进阶的必备书籍

    JVM内存管理和垃圾回收

    <<JVM内存管理和垃圾回收>> word版 博文链接:https://ayufox.iteye.com/blog/214411

    [转载]深入理解JVM

    ### 深入理解JVM #### 一、Java技术与Java虚拟机 Java不仅仅是一种编程语言,更是一项综合性的技术。它主要包括四个关键组成部分: 1. **Java编程语言**:这是一种面向对象的编程语言,提供了丰富的类库支持,...

    jvm_gc.rar_jvm_垃圾回收

    **JVM内存模型** Java虚拟机(JVM)是Java程序运行的基础,它为Java应用程序提供了运行时环境。JVM的内存模型分为多个区域,理解这些区域的工作原理对于优化Java程序性能至关重要。 1. **堆内存(Heap)**:这是...

    jvm 启动过程 JVM 原理

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的启动过程及其基本原理。 首先,我们需要理解JVM的基本概念。JVM是Java Virtual Machine的缩写,它是...

    JVM内存模型以及垃圾回收相关资料

    JVM内存模型与垃圾回收是Java性能优化的关键部分。JVM(Java Virtual Machine)内存模型分为多个区域,包括新生代(New Generation)、老年代(Old Generation)和永久代(Permanent Generation)。新生代又细分为...

    JVM图解-JVM指令-JVM原型图.rar

    在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...

Global site tag (gtag.js) - Google Analytics