2012-07-26 121 views
2

我最近做了一個hprof格式的heapdump,當我的jboss服務器運行時,xms爲4096m,xmx爲4096m,數據大小爲512m。堆轉儲大小vs hprof大小

生成的hprof文件大於5GB。當我在visualvm,mat分析器或yourkit中加載heapdump時,我只能看到大約1GB的總字節數。我已經嘗試在yourkit中更改可達範圍,但它不會顯示超過1 GB的值。

任何想法文件大小與顯示的堆轉儲大小可能導致這種巨大差異?

PS:我使用的是jdk1.6.0_23

可惜我不能在這裏提交截圖。

在文件系統中的HPROF大小是5.227.659 kb和在yourkit它指出:其中740 MB字符串可達:

對象:9.738.282 /淺尺寸740 MB /保留大小6.652.515 (68%)/尺寸淺:381 MB(51%)/保留大小:381 MB(51%)

最大保留大小是字節[]的206.810.176你使用哪個命令

+0

你可以發佈VisualVM中'Summary'選項卡的屏幕截圖嗎? – 2012-07-26 13:49:22

+0

我無法添加屏幕截圖,但我確實添加了來自yourkit的信息 – Michael 2012-07-27 07:18:25

+0

來自YourKit的數據並不能幫助我 - 我不知道它們是如何計算的。我知道這是如何在VisualVM中完成的。如果您希望我幫助您,請提供「基本信息」部分的數據(複製位於上下文菜單中),或者您可以將壓縮堆轉儲上傳到某處並將鏈接發送給我。 – 2012-07-27 15:05:38

回答

2

生成堆轉儲?

$JAVA_HOME/bin/jmap -dump:live,format=b,file=c:/tmp/heap_dump.bin PID 

也許你需要通過現場選項,根據規範

-dump:<dump-options> to dump java heap in hprof binary format 
        dump-options: 
        live   dump only live objects; if not specified, 
            all objects in the heap are dumped. 
+0

嗨,我們使用以下命令:jmap -F -dump:format = b,file = $ {filename} $ PID。根據oracle的實時選項:「如果指定,只有堆中的活動對象被轉儲。」所以,如果我指定這個,堆轉儲最可能會更小,但也可能會減少我找到內存泄漏的原因 – Michael 2012-07-26 10:50:44

+0

這真的是一個很好的問題 - 什麼是活的對象?我假設活體對象是不可用於GC的東西。所以我猜活的選擇將只是刪除垃圾對象,你將只有活的對象 - 這並不意味着這減少了發現的機會...我最近發現真正巨大的轉儲(大約16 GB)的實時選項內存泄漏很少, ... – 2012-07-26 11:02:21

+0

嗨安德烈,謝謝你的迴應。 「我最近在真正巨大的轉儲(大約16GB)中發現了很多內存泄漏,」我可以想象它可能會有所幫助,但它仍然沒有意義,爲什麼磁盤上的hprof大小與當我在這些工具中加載hprof(heapdump)時,分析工具顯示的大小...... – Michael 2012-07-26 11:54:50

2

你嘗試「不可達的對象直方圖」(你可以找到「概述」頁面頂部的鏈接)?在我的一個大小爲1509MB的堆棧中,mat只顯示了454MB,但其餘的基本上都是垃圾,確實,無法訪問的對象直方圖中的「Shallow Heap」總和爲966MB。

1

這只是意味着,如果GC要運行,那麼很可能您的堆轉儲包含大量無法訪問的對象,這些對象會被垃圾收集。 現在這並不意味着你仍然沒有泄漏,只是意味着在你的5 GB Hprof中,4 GB的對象是無法訪問的,因此不是有趣的泄漏源。

在Java中,只有當垃圾收集無法清除某個對象時纔會發生內存泄漏,因爲某些對象持有引用(意外)。所以你的泄漏(如果有的話)將被發現在你的hprof中剩下的1GB物體中。