`
ssxxjjii
  • 浏览: 951098 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过jinfo工具在full GC前后做heap dump

 
阅读更多

http://rednaxelafx.iteye.com/blog/1049240

 

想像一个Java进程在远程服务器上突然遇到频繁full GC的状况。我们只是想动态的改变HeapDumpBeforeFullGCHeapDumpAfterFullGC参数来获取full GC前后的heap dump,并不想在侵入到Java程序内去通过代码做这个工作。这种场景里jinfo就能派上用场了——它已经把相关的JMX操作给封装好了。
(提醒:如果找不到打出来的heap dump的话,请设置HeapDumpPath。这个参数指定heap dump的目录。
-XX:HeapDumpPath=path/to/your/heap/dumps/dir

上一篇其实已经提到了,通过jinfo -flag同样可以设置标记为manageable的VM参数。参考jinfo的帮助文档:

引用
Command prompt代码  收藏代码
  1. $ jinfo -help  
  2. Usage:  
  3.     jinfo [option] <pid>  
  4.         (to connect to running process)  
  5.     jinfo [option] <executable <core>  
  6.         (to connect to a core file)  
  7.     jinfo [option] [server_id@]<remote server IP or hostname>  
  8.         (to connect to remote debug server)  
  9.   
  10. where <option> is one of:  
  11.     -flag <name>         to print the value of the named VM flag  
  12.     -flag [+|-]<name>    to enable or disable the named VM flag  
  13.     -flag <name>=<value> to set the named VM flag to the given value  
  14.     -flags               to print VM flags  
  15.     -sysprops            to print Java system properties  
  16.     <no option>          to print both of the above  
  17.     -h | -help           to print this help message  



于是上一篇的实验可以用jinfo来做一次。

同样是在当前目录下放一个.hotspotrc文件来显示GC日志:

.hotspotrc代码  收藏代码
  1. +PrintGCDetails  



然后开groovysh来执行三次System.gc()。其中,第一次System.gc()之后在命令行调用下列命令:

Command prompt代码  收藏代码
  1. $ jps  
  2. 18711 Jps  
  3. 18650 GroovyStarter  
  4. $ jinfo -flag +HeapDumpBeforeFullGC 18650  
  5. $ jinfo -flag +HeapDumpAfterFullGC 18650  



然后在第二次System.gc()之后再调用:

Command prompt代码  收藏代码
  1. $ jinfo -flag -HeapDumpBeforeFullGC 18650  
  2. $ jinfo -flag -HeapDumpAfterFullGC 18650  



那么可以观察到Groovy Shell的运行状况是:

Groovysh代码  收藏代码
  1. $ groovysh  
  2. [GC [PSYoungGen: 14016K->1344K(16320K)] 14016K->1344K(53696K), 0.0072690 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]   
  3. [GC [PSYoungGen: 15360K->2288K(30336K)] 15360K->4824K(67712K), 0.0183850 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]   
  4. Groovy Shell (1.7.7, JVM: 1.6.0_25)  
  5. Type 'help' or '\h' for help.  
  6. ----------------------------------------------------------------------------------------------------------------------------  
  7. groovy:000> System.gc()  
  8. [GC [PSYoungGen: 26693K->2288K(30336K)] 29229K->8748K(67712K), 0.0262440 secs] [Times: user=0.05 sys=0.00, real=0.02 secs]   
  9. [Full GC (System) [PSYoungGen: 2288K->0K(30336K)] [PSOldGen: 6460K->8725K(37376K)] 8748K->8725K(67712K) [PSPermGen: 16933K->16933K(34176K)], 0.1172670 secs] [Times: user=0.11 sys=0.01, real=0.12 secs]   
  10. ===> null  
  11. groovy:000> System.gc()  
  12. [GC [PSYoungGen: 2932K->256K(30336K)] 11658K->8981K(67712K), 0.0017600 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]   
  13. [Heap Dump: Dumping heap to java_pid18650.hprof ...  
  14. Heap dump file created [18535501 bytes in 0.317 secs]  
  15. 0.3208840 secs][Full GC (System) [PSYoungGen: 256K->0K(30336K)] [PSOldGen: 8725K->8918K(37376K)] 8981K->8918K(67712K) [PSPermGen: 17045K->17045K(38464K)], 0.1131950 secs] [Times: user=0.11 sys=0.00, real=0.11 secs]   
  16. [Heap DumpDumping heap to java_pid18650.hprof.1 ...  
  17. Heap dump file created [18440786 bytes in 0.318 secs]  
  18. 0.3179790 secs]===> null  
  19. groovy:000> System.gc()  
  20. [GC [PSYoungGen: 1016K->160K(30336K)] 9935K->9078K(67712K), 0.0020120 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]   
  21. [Full GC (System) [PSYoungGen: 160K->0K(30336K)] [PSOldGen: 8918K->9028K(37376K)] 9078K->9028K(67712K) [PSPermGen: 17077K->17077K(36928K)], 0.1111340 secs] [Times: user=0.11 sys=0.00, real=0.11 secs]   
  22. ===> null  
  23. groovy:000> quit  
  24. Heap  
  25.  PSYoungGen      total 30336K, used 2427K [0x00000000edc000000x00000000efbe00000x0000000100000000)  
  26.   eden space 28032K, 8% used [0x00000000edc00000,0x00000000ede5ef68,0x00000000ef760000)  
  27.   from space 2304K, 0% used [0x00000000ef760000,0x00000000ef760000,0x00000000ef9a0000)  
  28.   to   space 2304K, 0% used [0x00000000ef9a0000,0x00000000ef9a0000,0x00000000efbe0000)  
  29.  PSOldGen        total 37376K, used 9028K [0x00000000c94000000x00000000cb8800000x00000000edc00000)  
  30.   object space 37376K, 24% used [0x00000000c9400000,0x00000000c9cd12b0,0x00000000cb880000)  
  31.  PSPermGen       total 36928K, used 17142K [0x00000000c42000000x00000000c66100000x00000000c9400000)  
  32.   object space 36928K, 46% used [0x00000000c4200000,0x00000000c52bdbb0,0x00000000c6610000)  



效果是:第二次System.gc()的时候,我们得到了两份HPROF格式的heap dump,而第一次与第三次都没有。

这样就可以很方便的在遇到full GC频繁的时候获取那么一两组heap dump来分析,而不需要在VM启动的时候就指定这两个参数——那样的话dump出来的文件就多了orz

分享到:
评论

相关推荐

    JVM Full GC 之 MAT工具分析实践-阿沐1

    《JVM Full GC 之 MAT 工具分析实践》 在Java开发中,理解JVM内存管理和垃圾收集机制至关重要,因为这直接关系到应用程序的性能和稳定性。当遇到内存溢出(OutOfMemoryError)、系统异常或者性能下降等问题时,我们...

    JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat

    JVM监控工具是Java开发者和运维人员不可或缺的工具,通过这些工具可以监控和诊断Java应用程序的性能和资源使用情况。本文将介绍五种JVM监控工具:jstack、jconsole、jinfo、jmap和jdb。 jstack jstack是一款命令行...

    java—JDK内置工具使用技巧详解

    - **使用场景**:当怀疑应用程序存在内存泄漏时,使用 jmap 生成 heap dump 文件,进一步通过其他工具(如 MAT 或 VisualVM)进行分析。 - **命令格式**:`jmap [options] &lt;pid&gt;` 或 `jmap [options] core` ##### 5...

    JDK监控和故障处理工具

    虽然JHAT在现代Java开发中使用较少,但它仍然是一个能够分析heapdump文件的工具。它能够启动一个web服务器,允许开发者通过浏览器查看对象的引用情况,这对于理解对象间的相互引用非常有用。 在实际使用中,开发者...

    JDK自带工具之jinfo.docx

    `jinfo`在`java`目录的`bin`子目录下,通过指定进程ID可以实时获取或修改JVM参数。 ### 1. jinfo指令格式 `jinfo`的基本用法是`jinfo [option] pid`,其中`option`是你要执行的操作,`pid`是你要操作的目标Java...

    jvm工具、参数调优&调试技巧

    - **使用方法**:`jhat &lt;heapdumpfile&gt;` 或 `jhat -J&lt;options&gt; &lt;heapdumpfile&gt;`。 ##### 5. jmap:内存映像工具 - **功能**:`jmap` 可以获取堆内存的快照,并将其输出为一个文件,也可以显示堆中的对象信息。 - **...

    【转】Java内存泄露_JVM监控工具介绍jstack_jconsole_jinfo_jmap_jdb_jstat

    通过`jstat -gc &lt;pid&gt; &lt;interval&gt; &lt;count&gt;`,我们可以定期获取JVM的垃圾回收状况,这对于优化内存配置和识别潜在的内存泄漏问题非常有帮助。 总的来说,这些工具为Java开发者提供了一套全面的诊断和监控手段,能够...

    JAVA JVM内存监控工具总结

    【Java JVM内存监控工具详解】 Java JVM内存监控是优化Java应用程序性能的关键环节,而VisualVM作为一款集成...在实际开发过程中,结合VisualVM等工具进行综合分析,能够更好地理解和解决问题,提升Java应用的性能。

    JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat.doc

    通过`jconsole`,用户可以监控Java应用的内存使用、Heap大小、线程状态、类加载状态等信息。其图形界面直观易用,适合于快速检查和分析JVM运行状态。 #### 3. jinfo —— Java Configuration Information `jinfo` ...

    Java 内存区域和GC机制

    - **GC类型**:主要分为Minor GC(年轻代GC)、Major GC(老年代GC)和Full GC(全局GC)。 - **GC策略**:包括复制算法、标记-清除算法、标记-整理算法、分代收集策略等,根据JVM版本和配置不同而有所不同。 - *...

    虚拟机监控工具详请.rar

    jhat与jmap配合使用,它是一个命令行工具,用于分析由jmap生成的heap dump文件。它建立一个基于HTTP/HTTPS的服务,通过浏览器界面查看堆内存使用情况,识别可能的内存泄漏。虽然jhat功能强大,但由于现代内存分析...

    JVM 监控 调优 工具

    本文将深入探讨JVM内存结构、监控工具及其在调优和GC优化中的应用。 **JVM内存机构** JVM内存主要分为以下几个区域: 1. **堆内存(Heap)**:这是JVM中最大的一块内存区域,主要用于存储对象实例。堆被进一步...

    实战Hot Spot JVM GC

    在GC监控方面,除了使用JMX参数外,还可以使用-Xloggc:文件参数来记录GC日志,并通过-XX:+PrintGCDetails等参数打印GC的详细信息。 优化建议包括合理设置堆内存大小,选择合适的垃圾回收器,调整新生代与老年代的...

    Java性能调优命令

    通过jvisualvm工具,可以查看线程堆栈,监控GC行为,甚至在内存溢出时获取堆dump文件来分析内存使用情况。这些信息对于诊断和解决内存相关的问题至关重要。 综上所述,Java性能调优涉及多个层面,包括但不限于监控...

    Java性能监控工具

    在实际使用中,我们可以利用这些工具对Java应用进行监控,比如在Jboss这样的应用服务器中,通过添加特定的Java选项(如`-agentpath:libjprofilerti.so=port=8849`)启用JProfiler进行远程监控。通过分析CPU视图和堆...

    阿里巴巴故障治理领域的智能运维实践

    在故障排查过程中,使用了多种工具来排查问题,包括MAT(heap dump分析工具)、jstack(线程dump工具)、jmap(内存dump工具)、gcore(核心dump工具)、btrace(性能分析工具)、gperftools(性能分析工具)、ulimit(系统资源...

    JVM监控工具介绍.docx

    例如,如果需要快速定位内存泄漏,可以使用`jmap -histo` 或者结合`jstat -gc` 和`jmap -heap`。如果关心线程状态,`jstack` 是首选。对于整体性能的可视化监控,`jconsole` 是个不错的选择。熟练掌握这些工具的使用...

    JAVA性能分析

    1. **获取堆文件**: 使用Jvisualvm工具在远程服务器上生成堆文件`heapdump-xxxxxxxxxx.hprof`。 2. **使用MemoryAnalyzer分析**: MemoryAnalyzer是一款由Eclipse提供的免费内存分析工具,它可以独立使用也可以作为...

    Java监控工具.pdf

    这些工具通常包含在Java Development Kit (JDK) 中,为开发者提供了深入洞察JVM (Java Virtual Machine) 运行时行为的能力。以下是一些主要的Java监控工具及其用途: 1. **jcmd**: jcmd 是一个命令行工具,用于获取...

    JVM性能调优监控工具1

    Java虚拟机(JVM)性能调优是优化Java应用程序的关键环节,而监控工具在此过程中扮演着至关重要的角色。本文将详细介绍几个常用的JVM性能监控工具及其功能,包括Jinfo、Jstat、Jmap和Jstack。 1. **Jinfo**: ...

Global site tag (gtag.js) - Google Analytics