2010-05-11 74 views
7

在工作中,我們發現在某些情況下(特別是緩慢的情況下),我們有不同的行爲,在重啓時獲得。我們可以查看JVM內存中的對象嗎?

我們猜測一個緩存沒有被正確初始化,或者是一個併發問題...... 無論如何,它在任何其他環境中都不能再生產。

我們居然沒有記錄器激活...這是一箇舊的組件...

因此,我想知道是否有工具,可以幫助我們看到存在於不同OBJETS JVM內存以檢查緩存內容...

謝謝!

編輯:

我沒有訪問生產服務器直接,我們的應用程序服務器的WebLogic 10,我沒有一個指向對象的指針,但我知道緩存對象類型.. 。

EDIT2:

我們的服務器上JRE 1.5上運行,是有可能使用JMAP?在JDK5無法找到它:( 此外,遠程調試可能是好的,但我們不能出於安全考慮......

EDIT3:

其實+與jHat VisualVM的是確定對我來說,我發現我的對象在轉儲中,但我無法正確讀取hashmap(包含大約60000項的對象)... 是否有工具以友好的方式讀取同時發生的映射?我需要找到一個鍵的值(或其在地圖中的存在),而沒有手動瀏覽60k記錄 其實我在eclipse MAT論壇上讀到它也不可能用它...

編輯4: 經過一些經驗,我真的很喜歡像VisualVM這樣的工具。也使用YourKit。 有一些有用的功能,如OQL找到您需要查看的正確實例...

+0

我不知道如何在沒有某種指針/變量引用的情況下訪問對象。 – aperkins 2010-05-11 17:32:37

回答

6

這基本上是要擴大將會說什麼。 通過讓我們的管理員完成生產系統的堆積,我獲得了巨大的成功,但要注意的是,要轉儲的特定服務器在轉儲完成之前將無法響應。然後獲取該文件並使用Eclipse MAT插件查看它。如果你不喜歡Eclipse,也可以使用Netbeans和普通的VisualVM插件。儘管這可以創建一些大文件,但您可能需要在64位系統上運行。

+1

VisualVM的+1 – ykaganovich 2010-05-11 20:11:02

+0

適用於Eclipse MAT的+1 - 這是最強大的(免費)堆可視化工具。強烈推薦,並有令人敬畏的插件以有趣的方式查看堆(例如收集填充%!)。 – 2010-05-12 02:04:45

3

您是否有權訪問對象的句柄/指針?如果是這樣,你可以在調試模式下啓動它,並在像Eclipse這樣的調試器中查看它。這將允許你檢查變量等。

或者,您可以編寫一個反射式瀏覽該類的日誌記錄器,並記錄發生了什麼。所有這些都假定您有一個位置,您可以開始進入代碼,或者獲取對緩存值的引用。


編輯:正如我在我的評論指出,我不知道的一種方式來獲得訪問某個對象沒有某種形式的引用或引用鏈接。例如,對象是否封裝在另一個對象中?如果是這樣,你可以這樣做以下:

Class<?> objectClass = myPointer.getClass(); 
Field[] objectFields = objectClass.getDeclaredFields(); 
for (Field field : objectFields) { 
    field.setAccessible(true); 
    //Or whatever you would need to do to get the information you need 
    System.out.println(field.get(myPointer).toString()); 
} 

你也可以這樣做:

Field targetField = objectClass.getDeclaredField("myFieldName"); 
targetField.setAccessible(true); 
MyOldObjectType target = (MyOldObjectType)targetField.get(myPointer); 
//do whatever you need to do here 

注意,所有的反射方法拋出異常,所以你將需要處理那些爲適當。另外,setAccessible(true)表示您可以訪問對象上的私有字段和方法。這是EXTREMELY DANGEROUS - 只有在絕對必要時才使用它。

+0

我不認爲像Eclipse中那樣的調試器是一種選擇,因爲「它在任何其他環境中都不能再生產」。 – 2010-05-11 17:20:26

+1

@Andrew Hubbs:我在生產環境中親自使用了Eclipse調試 - 您必須以調試模式啓動系統,並將其設置爲遠程連接。那裏有選項 - 這並不容易,但它是可能的。 – aperkins 2010-05-11 17:21:43

+0

我們的服務器不在同一個城市,我不知道他們是否可以在調試模式下啓動生產weblogic,也不知道他們是否允許我通過隧道訪問... – 2010-05-11 17:42:00

4

它很容易運行JMAP拋售對象實例的計數,但我不知道如果這就是你真正感興趣的。

您還可以使用JMAP做的堆轉儲整個堆,並與那個(和jhat),你可以看到對象的關係(即什麼對象指向什麼),但不一定是對象內容。

當然,數據在堆轉儲中存在,它不會「點擊」可見。

我認爲一些專業配置文件將允許您在堆轉儲中反思對象。

不然的話,您最好還是在應用程序中添加一些特定的檢測工具,以提供您要查找的特定內省,由自定義代碼,JMX或其他類型觸發。

+0

+1 - 我不知道堆轉儲。那對我來說會在一兩個月前真正有用:) – aperkins 2010-05-11 17:42:30

+0

我們使用java 1.5 是否可以在1.5 jre上使用jmap?我只在jdk6上發現了jmap,並且無法使用我的本地jre 1.5 ... – 2010-05-11 19:00:04

相關問題