文档章节

JVM 发生GC时的事件通知的机制

Sub
 Sub
发布于 2013/08/14 16:10
字数 453
阅读 674
收藏 6
如果您还在用Java 6的话,请赶紧升级到Java 7吧。 
以下以Java 7为基准来讨论。 

============================================================== 

在Java 7里有两种办法来监听GC事件。 

一种是比较传统的办法,从Java SE 5开始就可用。 
用C或C++或其它native语言来实现一个JVMTI agent,注册监听里面的 GarbageCollectionFinish 事件即可。 
JVMTI提供了GarbageCollectionStart和GarbageCollectionFinish事件,有需要的话前者也可以监听上。这两个事件都是在JVM处于GC暂停阶段之中发出的,此时不能执行任何Java代码。 
可以通过JVMTI的 GetStackTrace 函数来获取当时某个指定的Java线程的栈,或者用 GetAllStackTraces 来获取所有Java线程的栈。 

-------------------------------------------------------------- 

另一种是用Java 7新推出的JMX API的GC notification。用Java代码注册一个NotificationListener来监听GC事件即可。这边的事件是在GC完成之后才发出的。可以配置超时时间,只在超过指定的时间时才发出事件。 
具体用法可参考JavaDoc: GarbageCollectionNotificationInfo  
以及这个bug report里有具体注册GC notification的代码: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7087969  

我以前写过一个跟它的实现机制相关的笔记,有兴趣的话可以参考: https://gist.github.com/rednaxelafx/1465445 。相关邮件讨论: http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2011-August/002352.html  

同样用JMX, ThreadMXBean.dumpAllThreads 可以获取所有Java线程的栈。 

用JMX版虽然可以用Java代码写,挺方便,但它获得GC事件通知时JVM已经不在暂停阶段,所有Java线程都重新变成可运行的,于是此时获取的stack trace就不如JVMTI准确(至少从楼主的意图来看)。用JVMTI还是用JMX就看楼主自己的取舍了。

本文转载自:http://hllvm.group.iteye.com/group/topic/38227

共有 人打赏支持
Sub

Sub

粉丝 121
博文 94
码字总数 22632
作品 5
浦东
架构师
JAVA虚拟机垃圾回收机制和JAVA排错三剑客

一、Java虚拟机逻辑回收机制 1、Java垃圾回收器 Java垃圾回收器是Java虚拟机(JVM)的三个重要模块(另外两个是解释器和多线程机制)之一,为应用程序提供内存的自动分配(Memory Allocation)、自...

hawapple
06/28
0
0
[转] Java 启动参数大全

前段时间系统升级时遭遇了OOM,具体解决过程见 遭遇OutOfMemoryError; 为了巩固对于java启动各项参数的认识,决定将所有参数列举出来,并一一解释,以便后查; java启动参数共分为三类; 其一...

dodojava
2011/06/08
0
1
Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法

Java的JVM GC(Garbage Collection)垃圾回收原理机制及算法 Java GC(Garbage Collection)垃圾回收机制,Java VM中,存在自动内存管理和垃圾清理机制。GC机制对JVM(Java Virtual Machine)...

开开心心过
2017/10/17
0
0
成为JavaGC专家(2)—如何监控Java垃圾回收机制

本文是成为Java GC专家系列文章的第二篇。在第一篇《深入浅出Java垃圾回收机制》中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5种GC类型,...

stefanzhlg
2014/12/05
0
0
interview questions

1.java中为什么会出现多线程? Java内存模型决定了 CPU 不能 完全利用,为了充分利用CPU,所以产生了多线程技术。 2.多线程中,如果不调用start方法,直接调用run方法会发生什么? 只有调用T...

无断无灭无住无念
2017/11/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

iOS开发用到的图片尺寸汇总

启动图 型号 竖屏 横屏 iPhone SE 640px × 1136px 1136px × 640px iPhone 6s 750px × 1334px 1334px × 750px iPhone 6s Plus 1242px × 2208px 2208px × 1242px iPhone 7 750px × 1334......

业界小白
29分钟前
0
0
浅谈redis

redis是一个开源,内存式的健值存储数据库,也被称为健值存储的字典服务器。健值类型有字符串,hash(哈希类型),set(集合),list(列表) 和有序集合 特征细节: 内存式:redis将健值存储在主...

拐美人
36分钟前
0
0
无限扩容,按需使用!ZStack推出基于阿里云NAS的文件存储服务

日前,ZStack发布2.6.0版本,正式宣布推出基于阿里云NAS的文件存储服务。得益于业界领先的阿里云分布式存储架构,融合NAS后的ZStack 2.6.0拥有高性能、高可靠、容量无限扩展、一键操作、按需...

ZStack社区版
39分钟前
1
0
崛起于Springboot2.X之Mongodb多数据源处理(35)

多数据源:4个mongodb库! 目录结构图: 1、添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId>......

木九天
44分钟前
0
0
如何获取显示器的EDID信息

Q1: 为什么要写这篇文章? A1:在最近的工作中遇到了不少问题,其中很多都是和EDID相关的。可以说,作为一家以“显示”为生的企业,我们时时刻刻在与EDID打交道。EDID这东西很简单,但是如果...

DB_Terrill
45分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部