- 浏览: 3006460 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (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进程要获取自己的full GC次数的方法,同样是高度平台相关的办法。
大家如果熟悉JDK 6的内建工具,或许已经知道可以通过jstat工具很轻松的从外部得知一个Java进程的GC统计信息,其中就包括了full GC的次数。
假定我们相信jstat的数据是准确的,那么只要跟它从同一来源获取数据就可以保证我们拿到正确的full GC次数信息了。
查看OpenJDK 6中jstat的一个源文件,jdk/src/share/classes/sun/tools/jstat/resources/jstat_options,可以看到jstat -gcutil输出的YGC(young GC)与FGC(full GC)值分别是从下面两个定义而来的:
也就是说,在Oracle (Sun) HotSpot上,通过jvmstat API,找到名字为 "sun.gc.collector.0.invocations" 与 "sun.gc.collector.1.invocations" 的Monitor对象,我们就可以拿到YGC与FGC对应的值了。别的JVM即便支持该API,Monitor的名字也可能会不同;在Oracle (BEA) JRockit R28上,两者对应的名字分别为 "jrockit.gc.latest.yc.number" 与 "jrockit.gc.latest.oc.number" 。
在底层,HotSpot通过perfData接口来提供这些数据;注册数据的实现在services目录里。
OpenJDK官网上也有一个相关文档:HotSpot Jvmstat Performance Counters
提一下jvmstat文档上说的一个注意点:
也就是说我们最好别依赖这些计数器的名字。不过反正这帖只是介绍些hack的办法而已,不管了
下面用Groovy代码来演示一下。
使用jvmstat API需要指定vmid,对多数系统上本地Java进程的VMID就是PID。这里正好用上以前一帖介绍的获取进程自己的PID的方式。
可以看到,要获取young GC与full GC次数的读数很简单,找到合适的Monitor对象后,每次读一下value属性就好了。
在Groovy shell里演示一下使用情况,在Sun JDK 6 update 20/Windows XP SP3上跑:
这次也顺便演示一下在Oracle JRockit R28/Windows XP SP3上跑:
可以看到System.gc()引发的是young GC而不是full GC吧? ^_^
是上一篇…这个系列的第一篇是写JMX的,这个是第二篇,我正好心情好所以讲点hack的办法 >_<
大家如果熟悉JDK 6的内建工具,或许已经知道可以通过jstat工具很轻松的从外部得知一个Java进程的GC统计信息,其中就包括了full GC的次数。
假定我们相信jstat的数据是准确的,那么只要跟它从同一来源获取数据就可以保证我们拿到正确的full GC次数信息了。
查看OpenJDK 6中jstat的一个源文件,jdk/src/share/classes/sun/tools/jstat/resources/jstat_options,可以看到jstat -gcutil输出的YGC(young GC)与FGC(full GC)值分别是从下面两个定义而来的:
column { header "^YGC^" /* Young Generation Collections */ data sun.gc.collector.0.invocations align right width 6 format "0" } column { header "^FGC^" /* Full Collections */ data sun.gc.collector.1.invocations align right width 5 scale raw format "0" }
也就是说,在Oracle (Sun) HotSpot上,通过jvmstat API,找到名字为 "sun.gc.collector.0.invocations" 与 "sun.gc.collector.1.invocations" 的Monitor对象,我们就可以拿到YGC与FGC对应的值了。别的JVM即便支持该API,Monitor的名字也可能会不同;在Oracle (BEA) JRockit R28上,两者对应的名字分别为 "jrockit.gc.latest.yc.number" 与 "jrockit.gc.latest.oc.number" 。
在底层,HotSpot通过perfData接口来提供这些数据;注册数据的实现在services目录里。
OpenJDK官网上也有一个相关文档:HotSpot Jvmstat Performance Counters
提一下jvmstat文档上说的一个注意点:
引用
The instrumented HotSpot JVM exports a set of instrumentation objects, or counters as they are typically called. The set of counters exported by a JVM is not static, as a JVM may create certain counters only when appropriate arguments are specified on the command line. Furthermore, different versions of a JVM may export very different sets of instrumentation. The names of these counters and the data structures used to represent them are considered private, uncommitted interfaces to the HotSpot JVM. Users should not become dependent on any counter names, particularly those that start with prefixes other than "java.".
也就是说我们最好别依赖这些计数器的名字。不过反正这帖只是介绍些hack的办法而已,不管了
下面用Groovy代码来演示一下。
使用jvmstat API需要指定vmid,对多数系统上本地Java进程的VMID就是PID。这里正好用上以前一帖介绍的获取进程自己的PID的方式。
import java.lang.management.ManagementFactory import sun.jvmstat.monitor.*; class Runtimes { static int getOwnPid() { def name = ManagementFactory.runtimeMXBean.name name[0..<name.indexOf('@')] as int } } class GCStats { // Oracle (Sun) HotSpot static final String YOUNG_GC_MONITOR_NAME = 'sun.gc.collector.0.invocations' static final String FULL_GC_MONITOR_NAME = 'sun.gc.collector.1.invocations' // Oracle (BEA) JRockit // static final String YOUNG_GC_MONITOR_NAME = 'jrockit.gc.latest.yc.number' // static final String FULL_GC_MONITOR_NAME = 'jrockit.gc.latest.oc.number' static final Monitor youngGCMonitor; static final Monitor fullGCMonitor; static { def vmId = new VmIdentifier(Runtimes.ownPid as String) def interval = 0 def monitoredHost = MonitoredHost.getMonitoredHost(vmId) def monitoredVm = monitoredHost.getMonitoredVm(vmId, interval) youngGCMonitor = monitoredVm.findByName(YOUNG_GC_MONITOR_NAME) fullGCMonitor = monitoredVm.findByName(FULL_GC_MONITOR_NAME) } static int getYoungGCCount() { youngGCMonitor.value } static int getFullGCCount() { fullGCMonitor.value } }
可以看到,要获取young GC与full GC次数的读数很简单,找到合适的Monitor对象后,每次读一下value属性就好了。
在Groovy shell里演示一下使用情况,在Sun JDK 6 update 20/Windows XP SP3上跑:
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(); System.gc(); System.gc() ===> null groovy:000> GCStats.fullGCCount ===> 4 groovy:000> GCStats.youngGCCount ===> 9 groovy:000> System.gc(); System.gc(); System.gc() ===> null groovy:000> GCStats.youngGCCount ===> 9 groovy:000> GCStats.fullGCCount ===> 7 groovy:000> quit
这次也顺便演示一下在Oracle JRockit R28/Windows XP SP3上跑:
D:\>\sdk\groovy-1.7.2\bin\groovysh Groovy Shell (1.7.2, JVM: 1.6.0_17) Type 'help' or '\h' for help. -------------------------------------------------- groovy:000> GCStats ===> class GCStats groovy:000> GCStats.youngGCCount ===> 1 groovy:000> System.gc() ===> null groovy:000> GCStats.youngGCCount ===> 2 groovy:000> System.gc(); System.gc(); System.gc() ===> null groovy:000> GCStats.youngGCCount ===> 5 groovy:000> GCStats.fullGCCount ===> 0 groovy:000> quit
可以看到System.gc()引发的是young GC而不是full GC吧? ^_^
评论
4 楼
RednaxelaFX
2010-12-04
IcyFenix 写道
呃,原来你下一篇博客已经写了这个事,刚才没看到 = =#
是上一篇…这个系列的第一篇是写JMX的,这个是第二篇,我正好心情好所以讲点hack的办法 >_<
3 楼
IcyFenix
2010-12-04
呃,原来你下一篇博客已经写了这个事,刚才没看到 = =#
2 楼
RednaxelaFX
2010-12-04
那个…上一篇不就是用JMX来获取这种信息的么。另外System.gc()引发的GC种类我也根据具体实现来分开说明了,如果对此有疑问的话欢迎探讨,HotSpot这边我可以把源码找来说明它是触发full GC(或者是完全不引发GC,根据启动参数决定);JRockit是文档上写着引发minor GC的。
1 楼
IcyFenix
2010-12-04
撒加同学,我觉得取YGC和FGC次数,没有必要引jvmstat的类进来,jvmstat里面也是根据jmx开放的mbean来找gc次数的直接从jmx里面拿还省掉去找自己的pid,和平台也不用咬得那么死。下面的代码以ps/ps old收集器为例子,直接从mbean取gc次数:
另外,System.gc()引发哪种gc这个不是一概而论的吧。
package org.fenixsoft.jmx; import java.lang.management.ManagementFactory; import javax.management.MBeanServer; import javax.management.ObjectName; public class MBeanAccess { public static void main(String[] args) throws Exception { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName youngMBean = new ObjectName("java.lang:type=GarbageCollector,name=PS MarkSweep"); ObjectName tenuredMBean = new ObjectName("java.lang:type=GarbageCollector,name=PS Scavenge"); System.out.println("YGC:" + mbs.getAttribute(youngMBean, "CollectionCount")); System.out.println("FGC:" + mbs.getAttribute(tenuredMBean, "CollectionCount")); System.gc(); System.out.println("YGC:" + mbs.getAttribute(youngMBean, "CollectionCount")); System.out.println("FGC:" + mbs.getAttribute(tenuredMBean, "CollectionCount")); } }
另外,System.gc()引发哪种gc这个不是一概而论的吧。
发表评论
-
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 16101以前要在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 ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22197(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的练习,跟我对答案 ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ... -
oop、klass、handle的关系
2013-07-30 17:34 0oopDesc及其子类的实例 oop : oopDesc* ... -
Nashorn各种笔记
2013-07-15 17:03 0http://bits.netbeans.org/netbea ... -
《深入理解Java虚拟机(第二版)》书评
2013-07-08 19:19 0值得推荐的中文Java虚拟机入门书 感谢作者赠与的样书,以下 ... -
豆列:从表到里学习JVM实现
2013-06-13 14:13 48066刚写了个学习JVM用的豆列跟大家分享。 豆列地址:http: ...
相关推荐
GCViewer 能否分析 java 程序 GC 日志,能否图表展示堆内存,年轻代,老年代,永久带以及full gc 的使用情况
GC有两种类型:Scavenge GC(也称Young GC)和Full GC。 一般Full GC时,机器的Load会升高,应用也会停止响应一会(持续长达几秒),如果应用一直频繁的进行FullGC,一方面会出现应用无法提供正常服务,另一方面...
主要介绍了Java full gc触发情况实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
1. JVM调优 ...3.1 通过Java/JMX得到full GC次数? 3.2 如何更快的启动eclipse 4. JVM基础 4.1 JVM内存管理:深入Java内存区域与OOM 4.2 JVM内存管理:深入垃圾收集器与内存分配策略 4.3 深入理解JVM
AviatorEvaluator执行脚本导致Metaspace不足引发频繁 Full GC故障机经过 故障机经过 数据分析&特征平台DMP 最近频繁发生Full GC, 引发集群卡顿,导致经常超时,按照常规的方法,肯定是先看GC 日志 2020-02-17T10:17:...
1.查看当前机器上所有运行的java进程名称与pid(进程编号) 2.显示指定的jvm进程所有的属性设置和配置参数 1.方法一:使用jdk的jmap命令 2.方
GChisto及CMS GC相应补丁文件,补丁文件未亲测。 This patch adds the following features and improvements when using CMS GC in incremental mode: detecting Full GCs corrected parsing errors when using -XX:...
poi读取大量数据会造成gc内存溢出的报错,由于垃圾回收机制无法将大量的对象及时的回收,而这些对象又会保存在内存中,会导致内存不够用的情况,这时候我们就需要使用新的方法,读取为cvs即可.此解决方案可支持千万数据的...
jvm-full-gc调优-jvm-full-gc
主要给大家分享介绍了一次诡异的full gc查找问题全部过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧啊
当准备要触发一次Young GC时,如果发现统计数据说之前Young GC的平均晋升大小比目前老年代剩余的空间大,则不会触发Young GC而是转为触发Full GC。(通常情况) 如果有永久代的话,在永久代需要分配空间但已经没有...
在第一篇文章成为JavaGC专家PartI—深入浅出Java垃圾回收机制中我们学习了不同GC算法的执行过程,GC如何工作,新生代及老年代的基本概念,在JDK7中你应该了解的5种GC类型以及他们的性能如何。在第二篇文章成为JavaGC...
Full Stack AngularJS for Java Developers Build a Full-Featured Web Application from Scratch Using AngularJS with Spring RESTful
连接profinet 的Java库,可连接plc设备
VNC 4.13 src exe java VNC Open Source Code for Windows for Java
Full Stack AngularJS for Java Developers 英文无水印原版pdf pdf所有页面使用FoxitReader、PDF-XChangeViewer、SumatraPDF和Firefox测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看...
FGC:Full gc次数 FGCT:Full gc耗时(秒) GCT:gc总耗时(秒) Loaded:表示载入了类的数量 Unloaded 表示卸载类的数量 Compiled 表示编译任务执行的次数 Failed表示编译失败的次数 total:线程总数 ...
GC分为两种: Minor GC、Full GC(也叫做Major GC). Minor GC(简称GC) Minor GC是发生在新生代中的垃圾收集动作, 所采用的是复制算法。 GC一般为堆空间某个区发生了垃圾回收, 新生代(Young)几乎是所有java对象...
JAVA_FULL-Technical Questions and Answers