JRockit JRCMD教程

本文將為您提供概述和教程,說明如何使用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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372716.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372716.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372716.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sts java配置tomcat_STS配置Tomcat.9.0

今天&#xff0c;心血來潮&#xff0c;弄了一下STS,按著建立WEB項目的方式建立工程。一、新建工程(FILE --NEW--Dynamic Web project)二、輸入項目名稱&#xff0c;TestWeb&#xff0c;然后下一步&#xff0c;點擊FInish.三、新建index.jsp并打開index.jsp,書寫測試成功&#x…

javaweb國際化

根據數據的類型不同&#xff0c;國際化分為2類&#xff1a;靜態數據國際化和動態數據的國際化。 靜態數據&#xff0c;包括 “標題”、“用戶名”、“密碼”這樣的文字數據。 動態數據&#xff0c;包括日期、貨幣等可以動態生成的數據。 國際化涉及到java.util.Locale和java.ut…

20145335郝昊《網絡攻防》Bof逆向基礎——ShellCode注入與執行

20145335郝昊《網絡攻防》Bof逆向基礎——ShellCode注入與執行 實驗原理 關于ShellCode&#xff1a;ShellCode是一段代碼&#xff0c;作為數據發送給受攻擊服務器&#xff0c;是溢出程序和蠕蟲病毒的核心&#xff0c;一般可以獲取權限。我們將代碼存儲到對方的堆棧中&#xff0…

Java枚舉益智游戲

假設我們有以下代碼&#xff1a; enum Case {CASE_ONE,CASE_TWO,CASE_THREE;private static final int counter;private int valueDependsOnCounter;static {int sum 0;for(int i 0; i<10; i) {sum i;}counter sum;} Case() {this.valueDependsOnCounter counter*counte…

jp在java中無法編譯_JPanal上加圖片的問題!

JPanal上加圖片的問題&#xff01;import java.awt.BorderLayout;import java.awt.Dimension;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.*;import java.awt.*;public class Frame1 extends JFrame {JPanel contentPane;JLabel jLabel1 new JLa…

玩轉Android之加速度傳感器的使用,模仿微信搖一搖

Android系統帶的傳感器有很多種&#xff0c;最常見的莫過于微信的搖一搖了&#xff0c;那么今天我們就來看看Anroid中傳感器的使用&#xff0c;做一個類似于微信搖一搖的效果。 OK ,廢話不多說&#xff0c;我們就先來看看效果圖吧&#xff1a; 當我搖動手機的時候這里的動畫效果…

圖像

背景圖案的設置 將圖片插入到網頁中去 用圖像作為超鏈接 使用工具建立地圖索引 切片索引 為網站添加圖標 5.1 背景圖案的設置&#xff08;背景不占位置&#xff0c;不影響文本的輸入&#xff09; 格式&#xff1a;<body background"URL"> 5.2 將圖片插入…

Maven構建依賴項

熟悉發行版和快照依賴項的Maven和Gradle用戶可能不了解TeamCity快照依賴項&#xff0c;或者認為他們與Maven相關&#xff08;這是不正確的&#xff09;。 熟悉工件和快照依賴關系的TeamCity用戶可能不知道&#xff0c;除了TeamCity提供的插件之外&#xff0c;添加Artifactory插…

Java兩種設計模式_23種設計模式(11)java策略模式

23種設計模式第四篇&#xff1a;java策略模式定義&#xff1a;定義一組算法&#xff0c;將每個算法都封裝起來&#xff0c;并且使他們之間可以互換。類型&#xff1a;行為類模式類圖&#xff1a;策略模式是對算法的封裝&#xff0c;把一系列的算法分別封裝到對應的類中&#xf…

Problem E: 平面上的點——Point類 (II)

Description 在數學上&#xff0c;平面直角坐標系上的點用X軸和Y軸上的兩個坐標值唯一確定。現在我們封裝一個“Point類”來實現平面上的點的操作。 根據“append.cc”&#xff0c;完成Point類的構造方法和show()方法&#xff0c;輸出各Point對象的構造和析構次序。 接口描述&a…

MFC 控件RadioButton和CheckBox區別

1. 單個RadioButton在選中后&#xff0c;通過點擊無法變為未選中 單個CheckBox在選中后&#xff0c;通過點擊可以變為未選中 2. 一組RadioButton&#xff0c;只能同時選中一個 一組CheckBox&#xff0c;能同時選中多個 3. RadioButton在大部分UI框架中默認都以圓形表示 CheckBo…

什么是ActiveMQ?

盡管Active MQ網站已經對ActiveMQ進行了詳盡的介紹&#xff0c;但我想在其定義中添加更多上下文。 從ActiveMQ項目的網站上&#xff1a; “ ActiveMQ是JMS 1.1的開源實現&#xff0c;是J2EE 1.4規范的一部分。” 這是我的看法&#xff1a;ActiveMQ是一種開源消息傳遞軟件&…

字符串倒著輸出java_Java 輸出反轉字符串

Java 輸出反轉字符串public class Test {public static void main(String args[]){try{// 獲取鍵盤輸入的字符串BufferReader f new BufferReader(new inputStreamReader(System.in));String str f.readline();for (int i str.length() -1 ; i >0 ; i--) {System.out.p…

webpack基礎入門

我相信&#xff0c;有不少的朋友對webpack都有或多或少的了解。網上也有了各種各樣的文章&#xff0c;文章內作者也寫出了不少自己對于webpack這個工具的理解。在我剛剛接觸webpack的時候&#xff0c;老實說&#xff0c;網上大部分的文章我是看不懂的。。webpack里面有很多名詞…

位運算基礎

異或運算的基礎有點忘記了 先介紹一下。。2個數異或 就是對于每一個二進制位進行位運算 具有2個特殊的性質 1、一個數異或本身恒等于0&#xff0c;如5^5恒等于0&#xff1b; 2、一個數異或0恒等于本身&#xff0c;如5^0恒等于5。 3 滿足交換律 1.交換數字這個性質能利用與交換數…

JAXB自定義綁定– Java.util.Date / Spring 3序列化

JaxB可以處理Java.util.Date序列化&#xff0c;但是需要以下格式&#xff1a; “ yyyy-MM-ddTHH&#xff1a;mm&#xff1a;ss ”。 如果需要將日期對象格式化為另一種格式怎么辦&#xff1f; 我有同樣的問題時&#xff0c;我正在同春MVC 3和Jackson JSON處理器 &#xff0c;最…

雙足機器人簡單步態生成

讓機器人行走最簡單的方法是先得到一組步態曲線&#xff0c;即腿部每個關節隨時間運動的角度值。可以在ADAMS或3D Max、Blender等軟件中建立好機構/骨骼模型&#xff0c;設計出腳踝和髖關節的運動曲線&#xff0c;然后進行逆運動學解算&#xff0c;測量每個關節在運動過程中的轉…

重新訪問了訪客模式

訪客模式是面向對象設計中最被高估但又被低估的模式之一。 高估了它&#xff0c;因為它常常被選擇得太快&#xff08; 可能是由建筑宇航員選擇的 &#xff09;&#xff0c;然后以錯誤的方式添加時會膨脹本來非常簡單的設計。 如果您不遵循教科書示例&#xff0c;那么它可能會非…

java web開發技術大_2021年六大javaweb開發主流技術

作為歷史最為悠久的編程語言——java&#xff0c;歷經數十年依然盤踞在編程榜最前面的位置&#xff0c;這與它的技術和應用范圍是分不開的&#xff0c;同時呢&#xff0c;javaweb開發主流技術更是java開發者時時刻刻關注的問題&#xff0c;接下來我們一起分析一下2020年互聯網行…

ASP.NET—013:實現帶控件的彈出層(彈出框)

http://blog.csdn.net/yysyangyangyangshan/article/details/38458169 在頁面中用到彈出新頁面的情況比較多的&#xff0c;一般來說都是使用JS方法showModalDialog("新頁面相對路徑?參數1&參數2",window,"新頁面樣式");然后會新彈出一個模態的page頁。…