2012-09-14 38 views
4

有沒有辦法在eclipse或另一個調試器中設置一個斷點,以便在構建數組時停止執行?我對建立一個原始數組(int [])特別感興趣,但是這個問題應該同樣適用於任何數組。陣列構造上的斷點

我需要找到造成大量由int [],char []和byte []等組成的大量垃圾的罪魁禍首,所以如果我可以在某些條件下放置斷點,我將能夠縮小代碼範圍。

我試過使用yourkit內存分析,但它只顯示這些對象的一小部分的分配,其餘顯示爲<objects without allocation information>,我不知道爲什麼。當我進入Objects unreachable from GC roots視圖時,我看到只有約7%的垃圾分配信息。對於這樣一小部分物體的分配,我甚至不確定我是否缺少一些位置。有沒有辦法讓YK保存所有的分配?

+0

我不相信你可以。您的應用程序是在容器中運行,是富客戶端還是獨立應用程序?你能告訴我們更多關於你的應用程序的信息...記住原始類型(int,char,byte等)是Java的基本構建塊,所以即使你可以斷點創建數組,你也可以跨越很多代碼! – ramsinb

+0

這是一個獨立的應用程序,不知道我能告訴應用程序還有什麼,但我接受@Santosh的答案。 – haridsv

回答

3

,虛擬機只是保留對於多的內存空間爲填寫引用。這是一個單步原生操作並且內存分配過程中的斷點將不可能。例如採取以下代碼

public class Test{ 

public void createArray(){ 

     int[] iarray = new int[10]; 

    } 

} 

現在,如果你拆開這個,你就會得到下面的一組指令

Compiled from "Test.java" 
public class Test extends java.lang.Object{ 
public Test(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public void createArray(); 
    Code: 
    0: bipush 10 
    2: newarray int 
    4: astore_1 
    5: return 

} 

通知方法createArray()的定義,newarray int是一個單一的指令來分配存儲到指定的元素的數量。

0

World of Primitive arrays is really mysterious and I don't think anyone is allowed in there ;). 的,只有通過Java代碼的調試,以瀏覽的方式是F5F5 i.e.Step in僅適用於功能不申報,所以我想這是不可能的。

要確保當你構建一個數組,你可以打印使用Arrays.toString()這些陣列,它將打印所有元素陣列

2

我爲YourKit工作,所以我會嘗試澄清「沒有分配信息的對象」消息。

默認情況下,YourKit分析器記錄每個第10個對象的分配。這是一個可配置選項,因此將「記錄每個」值更改爲1應該有所幫助。這裏是探查器文檔的詳細信息http://www.yourkit.com/docs/11/help/allocations.jsp

+0

這正是我所做的,同時將大小限制設置爲0。我不認爲「沒有分配信息的對象」問題與此有關。無論如何,這個設置應該影響收集的數據量,而不是收集的數據量。 – haridsv