- 浏览: 3006321 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
通过Java/JMX得到full GC次数?
今天有个同事问如何能通过JMX获取到某个Java进程的full GC次数:
我回答说因为full GC概念只有在分代式GC的上下文中才存在,而JVM并不强制要求GC使用分代式实现,所以JMX提供的标准MXBean API里不提供“full GC次数”这样的方法也正常。
既然“full GC”本来就是非常平台相关的概念,那就hack一点,用平台相关的代码来解决问题好了。这些GC的MXBean都是有名字的,而主流的JVM的GC名字相对稳定,非要通过JMX得到full GC次数的话,用名字来判断一下就好了。
举个例子来看看。通过JDK 6自带的JConsole工具来查看相关的MXBean的话,可以看到,
GC的MXBean在这个位置:
这个例子是用server模式启动JConsole的,使用的是ParallelScavenge GC,它的年老代对应的收集器在这里:
该收集器的总收集次数在此,这也就是full GC的次数:
于是只要知道我们用的JVM提供的GC MXBean的名字与分代的关系,就可以知道full GC的次数了。
Java代码写起来冗长,这帖就不用Java来写例子了,反正API是一样的,意思能表达清楚就OK。
用一个Groovy脚本简单演示一下适用于Oracle (Sun) HotSpot与Oracle (BEA) JRockit的GC统计程序:
执行可以看到类似这样的输出:
↑这是用client模式的HotSpot执行得到的;
↑这是用JRockit R28在32位Windows上的默认模式得到的。
通过上述方法,要包装起来方便以后使用的话也很简单,例如下面Groovy程序:
用的时候:
这是在Sun JDK 6 update 20上跑的。顺带一提,如果这是跑在JRockit上的话,那full GC的次数就不会增加——因为JRockit里System.gc()默认是触发young GC的;请不要因为Sun HotSpot的默认行为而认为System.gc()总是会触发full GC的。
Poonam Bajaj以前也写过一篇blog提到HotSpot VM里的GC MBean的名字的:
Collector names for GarbageCollectorMXBean MXBean
关于JMX的MXBean的使用,也可以参考下面两篇文档:
Groovy and JMX
Monitoring the JVM Heap with JRuby
HotSpot VM现有的实现的话old gen只有一个,负责full GC/major GC的collector也只有一个。所以每次运行就只会有一个GarbageCollectorMXBean对应major GC。这帖里说的那些名字都试一次最多也只会得到1个结果。那个就是了。,难道是要用穷举法?
哈哈,那我只得把所有的GarbageCollector都列出来,做为ObjectName,一个个试了。ps:谢谢你的回复
HotSpot VM现有的实现的话old gen只有一个,负责full GC/major GC的collector也只有一个。所以每次运行就只会有一个GarbageCollectorMXBean对应major GC。这帖里说的那些名字都试一次最多也只会得到1个结果。那个就是了。
我在JDK6上一直用jconsole -server都没问题。如果你遇到问题那请详细说说是怎么个不行法。
jconsole -server
是,这个完全正解。
HotSpot的PermGen内存不足的时候确实也会触发full GC就是了…
perm...gen?这个上下文我没看出跟PermGen的关系是什么,求解
我勒个去。。我正在搞pergGen的测试,一不留神就说出来了。
是OLD区的gc 策略,我其实是想表达对应的full gc采用的收集器,根据收集器名称来找到full gc次数。
perm...gen?这个上下文我没看出跟PermGen的关系是什么,求解
嗯,一致就对了
本来如果只是要知道某个Java进程的GC次数和耗时统计,我会推荐用jstat来做。但这次同事问的是“如何通过JMX获取”,就给了上面的办法
引用
hi,问个问题,怎们在java中获取到full gc的次数呢?
我现在用jmx的那个得到了gc次数,不过不能细化出来full gc的次数
你比如我现在是这样拿次数的
我现在用jmx的那个得到了gc次数,不过不能细化出来full gc的次数
for (final GarbageCollectorMXBean garbageCollector : ManagementFactory.getGarbageCollectorMXBeans()) { gcCounts += garbageCollector.getCollectionCount(); }
你比如我现在是这样拿次数的
我回答说因为full GC概念只有在分代式GC的上下文中才存在,而JVM并不强制要求GC使用分代式实现,所以JMX提供的标准MXBean API里不提供“full GC次数”这样的方法也正常。
既然“full GC”本来就是非常平台相关的概念,那就hack一点,用平台相关的代码来解决问题好了。这些GC的MXBean都是有名字的,而主流的JVM的GC名字相对稳定,非要通过JMX得到full GC次数的话,用名字来判断一下就好了。
举个例子来看看。通过JDK 6自带的JConsole工具来查看相关的MXBean的话,可以看到,
GC的MXBean在这个位置:
这个例子是用server模式启动JConsole的,使用的是ParallelScavenge GC,它的年老代对应的收集器在这里:
该收集器的总收集次数在此,这也就是full GC的次数:
于是只要知道我们用的JVM提供的GC MXBean的名字与分代的关系,就可以知道full GC的次数了。
Java代码写起来冗长,这帖就不用Java来写例子了,反正API是一样的,意思能表达清楚就OK。
用一个Groovy脚本简单演示一下适用于Oracle (Sun) HotSpot与Oracle (BEA) JRockit的GC统计程序:
import java.lang.management.ManagementFactory printGCStats = { def youngGenCollectorNames = [ // Oracle (Sun) HotSpot // -XX:+UseSerialGC 'Copy', // -XX:+UseParNewGC 'ParNew', // -XX:+UseParallelGC 'PS Scavenge', // Oracle (BEA) JRockit // -XgcPrio:pausetime 'Garbage collection optimized for short pausetimes Young Collector', // -XgcPrio:throughput 'Garbage collection optimized for throughput Young Collector', // -XgcPrio:deterministic 'Garbage collection optimized for deterministic pausetimes Young Collector' ] def oldGenCollectorNames = [ // Oracle (Sun) HotSpot // -XX:+UseSerialGC 'MarkSweepCompact', // -XX:+UseParallelGC and (-XX:+UseParallelOldGC or -XX:+UseParallelOldGCCompacting) 'PS MarkSweep', // -XX:+UseConcMarkSweepGC 'ConcurrentMarkSweep', // Oracle (BEA) JRockit // -XgcPrio:pausetime 'Garbage collection optimized for short pausetimes Old Collector', // -XgcPrio:throughput 'Garbage collection optimized for throughput Old Collector', // -XgcPrio:deterministic 'Garbage collection optimized for deterministic pausetimes Old Collector' ] R: { ManagementFactory.garbageCollectorMXBeans.each { def name = it.name def count = it.collectionCount def gcType; switch (name) { case youngGenCollectorNames: gcType = 'Minor Collection' break case oldGenCollectorNames: gcType = 'Major Collection' break default: gcType = 'Unknown Collection Type' break } println "$count <- $gcType: $name" } } } printGCStats()
执行可以看到类似这样的输出:
5 <- Minor Collection: Copy 0 <- Major Collection: MarkSweepCompact
↑这是用client模式的HotSpot执行得到的;
0 <- Minor Collection: Garbage collection optimized for throughput Young Collector 0 <- Major Collection: Garbage collection optimized for throughput Old Collector
↑这是用JRockit R28在32位Windows上的默认模式得到的。
通过上述方法,要包装起来方便以后使用的话也很简单,例如下面Groovy程序:
import java.lang.management.ManagementFactory class GCStats { static final List<String> YoungGenCollectorNames = [ // Oracle (Sun) HotSpot // -XX:+UseSerialGC 'Copy', // -XX:+UseParNewGC 'ParNew', // -XX:+UseParallelGC 'PS Scavenge', // Oracle (BEA) JRockit // -XgcPrio:pausetime 'Garbage collection optimized for short pausetimes Young Collector', // -XgcPrio:throughput 'Garbage collection optimized for throughput Young Collector', // -XgcPrio:deterministic 'Garbage collection optimized for deterministic pausetimes Young Collector' ] static final List<String> OldGenCollectorNames = [ // Oracle (Sun) HotSpot // -XX:+UseSerialGC 'MarkSweepCompact', // -XX:+UseParallelGC and (-XX:+UseParallelOldGC or -XX:+UseParallelOldGCCompacting) 'PS MarkSweep', // -XX:+UseConcMarkSweepGC 'ConcurrentMarkSweep', // Oracle (BEA) JRockit // -XgcPrio:pausetime 'Garbage collection optimized for short pausetimes Old Collector', // -XgcPrio:throughput 'Garbage collection optimized for throughput Old Collector', // -XgcPrio:deterministic 'Garbage collection optimized for deterministic pausetimes Old Collector' ] static int getYoungGCCount() { ManagementFactory.garbageCollectorMXBeans.inject(0) { youngGCCount, gc -> if (YoungGenCollectorNames.contains(gc.name)) youngGCCount + gc.collectionCount else youngGCCount } } static int getFullGCCount() { ManagementFactory.garbageCollectorMXBeans.inject(0) { fullGCCount, gc -> if (OldGenCollectorNames.contains(gc.name)) fullGCCount + gc.collectionCount else fullGCCount } } }
用的时候:
D:\>\sdk\groovy-1.7.2\bin\groovysh Groovy Shell (1.7.2, JVM: 1.6.0_20) Type 'help' or '\h' for help. -------------------------------------------------- groovy:000> GCStats.fullGCCount ===> 0 groovy:000> System.gc() ===> null groovy:000> GCStats.fullGCCount ===> 1 groovy:000> System.gc() ===> null groovy:000> System.gc() ===> null groovy:000> GCStats.fullGCCount ===> 3 groovy:000> GCStats.youngGCCount ===> 9 groovy:000> GCStats.youngGCCount ===> 9 groovy:000> GCStats.youngGCCount ===> 9 groovy:000> System.gc() ===> null groovy:000> GCStats.youngGCCount ===> 9 groovy:000> GCStats.fullGCCount ===> 4 groovy:000> quit
这是在Sun JDK 6 update 20上跑的。顺带一提,如果这是跑在JRockit上的话,那full GC的次数就不会增加——因为JRockit里System.gc()默认是触发young GC的;请不要因为Sun HotSpot的默认行为而认为System.gc()总是会触发full GC的。
Poonam Bajaj以前也写过一篇blog提到HotSpot VM里的GC MBean的名字的:
Collector names for GarbageCollectorMXBean MXBean
关于JMX的MXBean的使用,也可以参考下面两篇文档:
Groovy and JMX
Monitoring the JVM Heap with JRuby
评论
15 楼
chainhou
2013-05-27
RednaxelaFX 写道
chainhou 写道
你好,想问个问题,我以-server启动应用,jConsole中的Garbage Collector是java.lang:type=GarbageCollector,name=PS MarkSweep和java.lang:type=GarbageCollector,name=PS Scavenge,不以-server启动,就是java.lang:type=GarbageCollector,name=MarkSweepCompact和java.lang:type=GarbageCollector,name=Copy,而我启动参数设置了-XX:+UseConcMarkSweepGC后,又是java.lang:type=GarbageCollector,name=ConcurrentMarkSweep,那这个负责full gc的收集器是以哪个为准,也就是怎样知道是哪个收集器负责full gc,从而获取full gc的次数?当然,人工通过visualVm和jconsole比对是可以知道的,但如果程序中就不好这样做了。
HotSpot VM现有的实现的话old gen只有一个,负责full GC/major GC的collector也只有一个。所以每次运行就只会有一个GarbageCollectorMXBean对应major GC。这帖里说的那些名字都试一次最多也只会得到1个结果。那个就是了。
哈哈,那我只得把所有的GarbageCollector都列出来,做为ObjectName,一个个试了。ps:谢谢你的回复
14 楼
RednaxelaFX
2013-05-27
chainhou 写道
你好,想问个问题,我以-server启动应用,jConsole中的Garbage Collector是java.lang:type=GarbageCollector,name=PS MarkSweep和java.lang:type=GarbageCollector,name=PS Scavenge,不以-server启动,就是java.lang:type=GarbageCollector,name=MarkSweepCompact和java.lang:type=GarbageCollector,name=Copy,而我启动参数设置了-XX:+UseConcMarkSweepGC后,又是java.lang:type=GarbageCollector,name=ConcurrentMarkSweep,那这个负责full gc的收集器是以哪个为准,也就是怎样知道是哪个收集器负责full gc,从而获取full gc的次数?当然,人工通过visualVm和jconsole比对是可以知道的,但如果程序中就不好这样做了。
HotSpot VM现有的实现的话old gen只有一个,负责full GC/major GC的collector也只有一个。所以每次运行就只会有一个GarbageCollectorMXBean对应major GC。这帖里说的那些名字都试一次最多也只会得到1个结果。那个就是了。
13 楼
chainhou
2013-05-27
你好,想问个问题,我以-server启动应用,jConsole中的Garbage Collector是java.lang:type=GarbageCollector,name=PS MarkSweep和java.lang:type=GarbageCollector,name=PS Scavenge,不以-server启动,就是java.lang:type=GarbageCollector,name=MarkSweepCompact和java.lang:type=GarbageCollector,name=Copy,而我启动参数设置了-XX:+UseConcMarkSweepGC后,又是java.lang:type=GarbageCollector,name=ConcurrentMarkSweep,那这个负责full gc的收集器是以哪个为准,也就是怎样知道是哪个收集器负责full gc,从而获取full gc的次数?当然,人工通过visualVm和jconsole比对是可以知道的,但如果程序中就不好这样做了。
12 楼
RednaxelaFX
2011-09-03
daly1987 写道
应该是jconsole -J-server ????
貌似直接-server不可以啊
貌似直接-server不可以啊
我在JDK6上一直用jconsole -server都没问题。如果你遇到问题那请详细说说是怎么个不行法。
11 楼
daly1987
2011-09-03
应该是jconsole -J-server ????
貌似直接-server不可以啊
貌似直接-server不可以啊
10 楼
RednaxelaFX
2011-08-18
daly1987 写道
用server模式启动JConsole???
怎么启动,有什么参数,我查文档没有啊
怎么启动,有什么参数,我查文档没有啊
jconsole -server
9 楼
daly1987
2011-08-18
用server模式启动JConsole???
怎么启动,有什么参数,我查文档没有啊
怎么启动,有什么参数,我查文档没有啊
8 楼
rain2005
2010-12-17
在分布式java应用与实践提到了猛男哦,我也是看了这本书才看一下虚拟机的哦,jstat,pidstat,jVisualVM够用了哦。其他的什么jstack还要看看。
7 楼
RednaxelaFX
2010-11-27
yznxing 写道
是OLD区的gc 策略,我其实是想表达对应的full gc采用的收集器,根据收集器名称来找到full gc次数。
是,这个完全正解。
yznxing 写道
我现在脑海里面一直闪现的是 permGen内存不足,触发FULL
GC~~~
GC~~~
HotSpot的PermGen内存不足的时候确实也会触发full GC就是了…
6 楼
yznxing
2010-11-27
我现在脑海里面一直闪现的是 permGen内存不足,触发FULL
GC~~~
GC~~~
5 楼
yznxing
2010-11-27
RednaxelaFX 写道
yznxing 写道
只要明确permgen区的 gc 策略,就可以通过jmx来获取对应的次数了吧。
perm...gen?这个上下文我没看出跟PermGen的关系是什么,求解
我勒个去。。我正在搞pergGen的测试,一不留神就说出来了。
是OLD区的gc 策略,我其实是想表达对应的full gc采用的收集器,根据收集器名称来找到full gc次数。
4 楼
RednaxelaFX
2010-11-27
yznxing 写道
只要明确permgen区的 gc 策略,就可以通过jmx来获取对应的次数了吧。
perm...gen?这个上下文我没看出跟PermGen的关系是什么,求解
3 楼
yznxing
2010-11-27
只要明确permgen区的 gc 策略,就可以通过jmx来获取对应的次数了吧。
下面是我测试获得的,的确是一样的,他们监控jboss的也是通过这种方式。
比较WS但是很简单,有效。
GC:[PS Scavenge: Count=142 GCTime=0.1470sec][PS MarkSweep: Count=45 GCTime=0.8160sec]
下面是我测试获得的,的确是一样的,他们监控jboss的也是通过这种方式。
比较WS但是很简单,有效。
GC:[PS Scavenge: Count=142 GCTime=0.1470sec][PS MarkSweep: Count=45 GCTime=0.8160sec]
2 楼
RednaxelaFX
2010-10-21
gaoerrong 写道
呵呵,按照这个方式和gclog中记录的full gc次数和时间完全一样。
嗯,一致就对了
本来如果只是要知道某个Java进程的GC次数和耗时统计,我会推荐用jstat来做。但这次同事问的是“如何通过JMX获取”,就给了上面的办法
1 楼
gaoerrong
2010-10-21
呵呵,按照这个方式和gclog中记录的full gc次数和时间完全一样。
发表评论
-
做菜与洗碗
2014-12-20 15:45 13097今天晚饭,老婆连着用了4个锅来做了两菜一汤。好吃 其中一道菜 ... -
The Prehistory of Java, HotSpot and Train
2014-06-02 08:18 0http://cs.gmu.edu/cne/itcore/vi ... -
MSJVM and Sun 1.0.x/1.1.x
2014-05-20 18:50 0当年的survey paper: http://www.sym ... -
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
class data sharing by Apple
2014-03-28 05:17 0class data sharing is implement ... -
Java 8与静态工具类
2014-03-19 08:43 16100以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10306先看看下面这个代码例子, interface IFoo { ... -
HotSpot Server VM与Server Class Machine
2014-02-18 13:21 0HotSpot VM历来有Client VM与Server V ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
GC stack map与deopt stack map的异同
2014-01-08 09:56 0两者之间不并存在包含关系。它们有交集,但也各自有特别的地方。 ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
基于LLVM实现VM的JIT的一些痛点
2014-01-07 17:25 0同事Philip Reames Sanjoy Das http ... -
tailcall notes
2013-12-27 07:42 0http://blogs.msdn.com/b/clrcode ... -
《自制编程语言》的一些笔记
2013-11-24 00:20 0http://kmaebashi.com/programmer ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22197(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局 (0): 拿在手上的是什么
2013-11-04 18:22 21312(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对C语义的for循环的基本代码生成模式
2013-10-19 23:12 21708之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ...
相关推荐
1. JVM调优 ...3.1 通过Java/JMX得到full GC次数? 3.2 如何更快的启动eclipse 4. JVM基础 4.1 JVM内存管理:深入Java内存区域与OOM 4.2 JVM内存管理:深入垃圾收集器与内存分配策略 4.3 深入理解JVM
Java版 jmx 监控weblogic 生成html
最新的hdfs namenode主备安装文档,详细,命令只需要copy执行即可
java jmx操作示例源码 文章地址:http://blog.csdn.net/mr__fang/article/details/41645377
Zabbix通过JMX方式监控java中间件 Zabbix2.0添加了支持用于监控JMX应用程序的服务进程,称为“Zabbix-Java-gateway”;它是用java写的一个程序。 工作原理: zabbix_server想知道一台主机上的特定的JMX值时,它向...
java jmx agent不安全的配置漏洞如何改进(由浅入深代码范例和详细说明).docx
个人收集整理的学习java JMX的好东西,帮助初学者更好的理解JMX的作用和使用方式。个人认为包括的资料比较全了。
You will find this book to be useful long after new versions of JMX become available because the concepts introduced here are classic applications of management concepts and technologies to the Java ...
原文链接:https://blog.csdn.net/m0_37814112/article/details/118852474?spm=1001.2014.3001.5501 说明:包括jmx_prometheus_javaagent-0.16.1.jar和prometheus-jmx-config.yaml
Hbase和Hadoop JMX监控实战
JVM JMX java
需要的自会需要,介绍没用,亲测可用。 javax.jms包,sun的JMS接口规范包,官方已经不提供了,这里给2分,给大家下载。
Java™ and JMX: Building Manageable Systems By Heather Kreger, Ward Harold, Leigh Williamson Publisher : Addison Wesley Pub Date : December 30, 2002 ISBN : 0-672-32408-3 Pages : 592
代理Java包,用于生成JVM的健康的数据,jmx_prometheus_javaagent-0.12.0.jar
FROM confluentinc/cp-kafka:4.1.0COPY prometheus-exporter/jmx_prometheus_javaagent-0.3.0.jar /usr/share/java/kafka/jmx_prometheus_javaagent-0.3.0.jarCOPY prometheus-expoerter/jmx-exporter.yml /usr/...
java jmx 远程监控
Addison Wesley - Java and JMX (2002).chm
JMX 1.2.1 Reference Implementation(重点) Include com.sun.jdmk.comm.HtmlAdaptorServer class http://www.sun.com/software/jdmk/ Downloads, sun-jdmk-runtime-5.1-b34.2.zip/SUNWjdmk/5.1/lib/jdmkrt.jar
gaelyk-functional-test.zip,为gaelyk功能测试数据存储生成器dsl提供运行时依赖项