本文将为您提供概述和教程,说明如何使用jrcmd工具对JRockit Java Heap问题进行初始分析和问题隔离。 将来的文章中将介绍使用JRockit任务控制和堆转储分析(仅限JRockit R28 +版)的更深入的分析和教程。

有关JRockit Java堆空间的快速概述,请查阅以下文章:
JRockit Java堆空间

JRCMD工具概述

jrcmd是一个免费工具,可以在JRockit二进制文件中直接使用。 它允许您从运行时JRockit VM生成和收集关键数据,例如:

  • Java进程内存空间细分(Java堆与本机内存空间)
  • Java堆诊断(直方图)– Java加载的类
  • 按需JRockit堆转储生成(仅版本R28 +)
  • 线程转储生成
  • 更多…

对于本文,我们创建了一个内部泄漏的简单Java程序。 我们将使用该程序来演示如何利用jrcmd进行初始分析。

示例Java内存泄漏程序

这个简单的Java程序只是将String数据添加到静态HashMap中,然后慢慢泄漏到JVM耗尽Java Heap内存的地步。 该程序将允许您通过JRockit jrcmd可视化一个缓慢增长的Java堆泄漏。 请注意,此示例使用了128 MB(-Xms128m –Xmx128m)的Java堆大小。

/*** JavaHeapLeakSimulator* @author Pierre-Hugues Charbonneau* http://javaeesupportpatterns.blogspot.com*/public class JavaHeapLeakSimulator {private final static int NB_ITERATIONS = 500000000;// ~1 KB data footprintprivate final static String LEAKING_DATA_PREFIX = "datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata
datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadata";// Map used to stored our leaking String instancesprivate static Map<String, String> leakingMap;static { leakingMap = new HashMap<String, String>();}/*** @param args*/public static void main(String[] args) {System.out.println("Java Heap Leak Simulator 1.0"); System.out.println("Author: Pierre-Hugues Charbonneau");System.out.println("http://javaeesupportpatterns.blogspot.com/");try {for (int i = 0; i < NB_ITERATIONS; i++) {String data = LEAKING_DATA_PREFIX + i;// Add data to our leaking Map data structure...leakingMap.put(data, data);                             // Slowdown the Java program so we can monitor the leak before the OutOfMemoryError conditionThread.sleep(1);}} catch (Throwable any) {if (any instanceof java.lang.OutOfMemoryError) {System.out.println("OutOfMemoryError triggered! "+ any.getMessage() + " [" + any + "]");} else {System.out.println("Unexpected Exception! " + any.getMessage() + " [" + any + "]");}}System.out.println("JavaHeapLeakSimulator done!"); }
}

JRCMD –初始执行

可以从托管您要监视的JVM的本地服务器执行JRCMD,也可以通过JRockit Mission Control远程执行。 可执行文件位于您使用的JRockit JDK中:

<JRockit_JDK_HOME>/bin/jrcmd

默认的jrcmd执行将返回您可以监视的活动JRockit Java进程ID的列表:

C:\Apps\Weblogic1035\jrockit_160_24_D1.1.2-4\bin>jrcmd
5360 org.ph.javaee.tool.oom.JavaHeapLeakSimulator
5952
6852 jrockit.tools.jrcmd.JrCmd

JRCMD – Java堆监视

下一步是开始监视Java Heap内存使用情况和直方图。 Java堆直方图是Java类实例最大池的快照。 这使您可以查明泄漏的数据类型。 Ple

您可以在print_object_summary(快速摘要)或heap_diagnostics(完全分解)之间选择。

C:\Apps\Weblogic1035\jrockit_160_24_D1.1.2-4\bin>jrcmd 5360 heap_diagnosticsInvoked from diagnosticcommand======== BEGIN OF HEAPDIAGNOSTIC =========================Total memory in system: 8465022976 bytes
Available physical memory in system: 5279170560 bytes
-Xmx (maximal heap size) is 134217728 bytes
Heapsize: 134217728 bytes
Free heap-memory: 123592704 bytes--------- Detailed Heap Statistics: ---------90.9% 3948k     5468  +3948k [C 3.0% 128k     5490   +128k java/lang/String2.1% 92k     3941    +92k java/util/HashMap$Entry1.2% 50k      461    +50k java/lang/Class0.8% 35k       21    +35k [Ljava/util/HashMap$Entry;0.6% 24k        7    +24k [B0.3% 15k      305    +15k [Ljava/lang/Object;0.3% 14k      260    +14k java/net/URL0.2% 6k      213     +6k java/util/LinkedHashMap$Entry0.1% 4k      211     +4k java/io/ExpiringCache$Entry0.1% 2k        4     +2k [Ljrockit/vm/FCECache$FCE;0.0% 1k       50     +1k [Ljava/lang/String;0.0% 1k       10     +1k java/lang/Thread0.0% 1k       61     +1k java/util/Hashtable$Entry0.0% 1k        7     +1k [I0.0% 0k       19     +0k java/util/HashMap0.0% 0k       19     +0k java/lang/ref/WeakReference0.0% 0k        7     +0k [Ljava/util/Hashtable$Entry;0.0% 0k       19     +0k java/util/Locale0.0% 0k       11     +0k java/lang/ref/SoftReference0.0% 0k        1     +0k [S
…………………………………………………

–第一列对应于Class对象类型对Java Heap占用量的贡献,以%为单位
–第二列对应于以K为单位的Class对象类型的内存占用量
–第三列对应于特定类型的Class实例的# –第四列对应于特定类型的增量-/ +内存占用量

从上面的快照中可以看到,最大的数据类型是[C(在我们的例子中为char)和java.lang.String。 为了查看泄漏的数据类型,您将需要生成几个快照。 频率将取决于泄漏率。 在我们的示例中,在下面找到5分钟后拍摄的另一个快照:

# After 5 minutes--------- Detailed Heap Statistics: ---------93.9% 26169k    28746 +12032k [C2.4% 674k    28768   +295k java/lang/String2.3% 637k    27219   +295k java/util/HashMap$Entry0.9% 259k       21   +128k [Ljava/util/HashMap$Entry;0.2% 50k      462     +0k java/lang/Class0.1% 24k        7     +0k [B
# After 5 more minutes--------- Detailed Heap Statistics: ---------94.5% 46978k    50534 +20809k [C 2.4% 1184k    50556   +510k java/lang/String2.3% 1148k    49007   +510k java/util/HashMap$Entry0.5% 259k       21     +0k [Ljava/util/HashMap$Entry;0.1% 50k      462     +0k java/lang/Class

第三和第四列显示不断增加。 如您所见,在我们的案例中,泄漏数据为[C,java.lang.String和java.util.HashMap $ Entry,它们都从〜4 MB增加到28 MB,50 MB,并且还在不断增长……

通过这种方法很容易查明泄漏的数据类型,但是泄漏数据类型的来源(根本原因)呢? 这是jrcmd不再有用的地方。 更深入的内存泄漏分析将要求您使用JRockit Mission Control或堆转储分析(仅JRockit R28 +)。

最后一点,在确定真正的Java Heap泄漏之前,请确保在两次捕获之间至少有一个Full GC之后拍摄了jrcmd快照(您感兴趣的是OldGen泄漏,例如,在主要GC集合中幸存的Java对象)。

JRCMD线程转储生成

线程转储分析对于与卡死的线程相关的问题至关重要,但对于解决某些类型的Java Heap问题也很有用。 例如,它可以通过暴露在短时间内在Java Heap上分配大量内存的罪魁祸首来查明Java Heap突然增加的原因。 可以使用jrcmd print_threads选项生成线程转储。

**在删除Thread.sleep()并增加Java堆容量之后,从我们的示例Java程序捕获了线程转储**

C:\Apps\Weblogic1035\jrockit_160_24_D1.1.2-4\bin>jrcmd 5808 print_threads5808:===== FULL THREAD DUMP ===============Mon Apr 09 09:08:08 2012Oracle JRockit(R) R28.1.3-11-141760-1.6.0_24-20110301-1429-windows-ia32
"Main Thread" id=1 idx=0x4 tid=6076 prio=5 alive, native_blockedat jrockit/vm/Allocator.getNewTla(II)V(Native Method)at jrockit/vm/Allocator.allocObjectOrArray(Allocator.java:354)[optimized]at java/util/Arrays.copyOfRange(Arrays.java:3209)[inlined]at java/lang/String.<init>(String.java:215)[inlined]at java/lang/StringBuilder.toString(StringBuilder.java:430)[optimized]at org/ph/javaee/tool/oom/JavaHeapLeakSimulator.main(JavaHeapLeakSimulator.java:38)at jrockit/vm/RNI.c2java(IIIII)V(Native Method)-- end of trace
……………………………………….

我们可以看到示例Java程序正在从执行JavaHeapLeakSimulator程序的“主线程”创建许多java.lang.String对象。

结论

我希望本文能帮助您理解可以利用JRockit jrcmd工具进行快速Java堆分析。 期待您的意见和问题。

未来的文章将包括更深入的JRockit Java堆和堆转储分析教程。

参考: Java EE支持模式和Java教程博客上的JCG合作伙伴 Pierre-Hugues Charbonneau的JRockit jrcmd教程 。

翻译自: https://www.javacodegeeks.com/2012/04/jrockit-jrcmd-tutorial.html

JRockit JRCMD教程相关推荐

  1. jrockit_JRockit JRCMD教程

    jrockit 本文将为您提供概述和教程,说明如何使用jrcmd工具对JRockit Java Heap问题进行初始分析和问题隔离. 将来的文章中将介绍使用JRockit任务控制和堆转储分析(仅JRo ...

  2. JRockit – JRCMD有用的命令

    自2007年以来,我一直在使用JRockit.我发现它比Hotspot速度慢,但在诊断和分析问题上总是更好. 从去年夏天开始,我一直在为一家国际电信系统供应商工作. 我们在HP OpenCall Co ...

  3. 面试高频!JVM必备教程~

    请你谈谈你对JVM的理解?Java8虚拟机和之间的变化更新? JVM类加载器是怎么样的?有几种? 什么是OOM,什么是StackOverFlowError? 怎么分析? JVM常用调优参数有哪写? G ...

  4. 高性能服务器编程代码清单9-3,JRockit JVM优化清单/调优指南

    摘要 本文的目的是以清单的方式提供BEA JRockit JVM的调优信息.从深奥的命令行选项到迭代性能测试,本文涵盖了许多方面.大部分数据都是我与用户合作过程中收集的.您要是也有什么技巧的话,请告诉 ...

  5. gc可视化分析_GC内存可视化器教程–第一部分

    gc可视化分析 正如您从过去的文章中可能已经读到的那样,要获得的Java程序员的一项关键技能就是理解和评估JVM的运行状况的能力,例如Java堆内存占用量以及垃圾回收过程. 为了实现上述目标,所有JV ...

  6. jrockit_JRockit – JRCMD有用的命令

    jrockit 自2007年以来,我一直在使用JRockit.我发现它的速度比Hotspot慢,但在诊断和分析问题上总是更好. 从去年夏天开始,我一直在为一家国际电信系统供应商工作. 我们在HP Op ...

  7. jrockit_Java堆空间– JRockit和IBM VM

    jrockit 本文将为您提供JRockit Java堆空间与HotSpot VM的概述. 它还将为您提供有关JRockit和HotSpot的Oracle未来计划的一些背景知识. Oracle JRo ...

  8. jrockit_1.6下载_Oracle JRockit Mission Control 4.1发布

    jrockit_1.6下载 Oracle发布了以前的仅JRockit专用工具Mission Control Suite(JRMC)的新版本. 4.1版本是次要版本升级,直接遵循4.0.1(该版本发布于 ...

  9. GC内存可视化器教程–第一部分

    正如您从以前的文章中可能已经读到的那样,要获得的Java程序员的一项关键技能就是理解和评估JVM的运行状况的能力,例如Java堆内存占用量以及垃圾回收过程. 为了实现上述目标,所有JVM供应商(Ora ...

最新文章

  1. Web应用中的轻量级消息队列
  2. python进制表示方法_python 16进制表示什么
  3. 跨域请求设置withCredentials
  4. python字典里可以放列表吗_学习python之列表及字典
  5. Ubuntu18.04 安装MySQL、Navicat
  6. 疯狂软件2月3日Android就业班课程详细
  7. HDU - 3247 Resource Archiver (AC自动机,状压dp)
  8. 团队编程项目作业1-成员简介及分工
  9. android 字体像素转换工具类_Android点9图机制及在聊天气泡中的应用
  10. 小觅相机运行VINS-Fusion(三)——IMU的标定
  11. 聚美优品根据关键词取商品列表 API
  12. 十个免费的Web负载/压力测试工具
  13. 300题目 第10讲 积分等式与积分不等式
  14. 数据库——oracle
  15. 电子信息工程专业考研选择物联网开发怎么样?
  16. Codeforces Puzzles
  17. 【CVPR 2021】DatasetGAN: Efficient Labeled Data Factory with Minimal Human Effort
  18. 数据分析师拯救猪队友的操作指南
  19. java生成SSCC编码第18位校验码
  20. layui复选框怎么取值_layui如何获取checkbox复选框的值

热门文章

  1. POJ3278(BFS入门)
  2. chrome gwt1.7_快速提示:使用Chrome开发工具调试GWT应用程序
  3. ssm影城项目_影场与属性访问器界面
  4. 应行家算法_一些行家技巧和窍门
  5. java 编译 器 ide_在没有IDE的情况下编译和运行Java
  6. java8 base64_Java 8中的Base64 –加入乐趣为时不晚
  7. 集成spring mvc_向Spring MVC Web应用程序添加社交登录:集成测试
  8. 使用React和Spring Boot构建一个简单的CRUD应用
  9. 使用Spring Data的Apache Ignite
  10. 实践中的弹性基础架构