2013-10-18 58 views
0

最近我正在做一個關於JVM和字節碼的實驗。JVM在加載庫類後會做些什麼??

我使用這些代碼片段來測試。

import java.util.*; 

public class Simple { 

    private String a = "abcdefghijklmnopaqrstuvwaxyazaaabcdefghijklmnopaqrstuvwaxyazaabcdefghijklmnopaqrstuvwaxyazaabcdefghijklmnopaqrstuvwaxyaz"; 

    public int test() 
    { 
     String bb = "abcdefghijklmnopaqrstuvwaxyazaaabcdefghijklmnopaqrstuvwaxyazaabcdefghijklmnopaqrstuvwaxyazaabcdefghijklmnopaqrstuvwaxyaz"; 

     int a = 0; 
     int b = a; 
     int c = a + b; 
     return c; 
    } 

    public static void main(String[] args) 
    { 
     String cc = "abcdefghijklmnopaqrstuvwaxyazaaabcdefghijklmnopaqrstuvwaxyazaabcdefghijklmnopaqrstuvwaxyazaabcdefghijklmnopaqrstuvwaxyaz"; 

     Simple simple = new Simple(); 
     simple.test(); 

     Scanner input=new Scanner(System.in); 
     System.out.println("how much money do you need?"); 
     double number=input.nextDouble(); 
    } 
} 

第一次使用HotSpot進行實驗。在Windows上,我忽略了

-Djava.compiler=NONE 

並使用HeapMemView查看HotSpot的堆內存。我可以找到一串「6162 6364 ..」(這與我的私有字符串變體相匹配),並找到我的代碼片段的字節碼序列。

但我不能找到Java標準庫的字節碼序列..像

Java.Lang.Obeject 
Java.Lang.Math 

什麼問題..?在我的理解,我想我應該找到在JVM的堆的字節碼序列..

然後我用的Jrocket做一遍..使用

-Djava.compiler=NONE 

打開編譯模式......但這一次,我甚至無法在堆上找到我的字符串變體....

我被困在這裏兩天..有人能幫我嗎?我真的很感激它...

謝謝!

+0

「字節碼序列」是什麼意思?我不明白爲什麼當你運行一個不使用該類的程序時,你希望在堆內找到java.lang.Math'。常量字符串的序列只是在加載類時臨時存在的臨時工件。在創建了String實例之後(它使用不同的表示形式,通常是UTF-16字符數組),該內存可能被用於其他目的。 – Holger

+0

嗨Holger,感謝您的回覆,我想我可以通過查找加載的Java標準庫的確切地址來做一個ROP到ByteCode ... – computereasy

+0

標準庫既沒有固定格式,也沒有完全加載到通常是JVM。 JVM運行時內的字節碼序列將不會與jar中的類文件相同。JVM對字節碼進行轉換以減少內存消耗(例如通過共享常量)並提高性能(例如,通過使用其他非標準JVM特定的操作碼)。你很難找到你想要的東西。 – Holger

回答

1

我被困在這裏兩天..有人能幫我一些幫助嗎?我真的很感激它...

我會專注於你要先解決的問題。也許你可以更清楚地知道你爲什麼要這樣做。

在Windows上,我真理的斷-Djava.compiler = NONE

這只是改變的代碼是如何編譯爲本地代碼。這不會以任何方式改變堆。

但我不能找到Java標準庫的字節碼序列..像

字節碼和類定義並不在堆中,他們在燙髮根。

+0

您好Peter,非常感謝您!我知道他們在JVM的「perm gen」中,但是Hotspot和JRockit都是用C++實現的,所以他們應該用C++的堆棧,我認爲HeapMemView可以查看C++堆。 – computereasy

+0

@computereasy在這種情況下,您應該查找UTF-16編碼的字符串,瞭解您爲什麼這樣做會很有幫助,因爲它不太可能是我能想到的任何事情的最簡單方式。 –

+0

謝謝你的答覆我在考慮如果在Java ByteCode上返回Oriented Programming是可行的(爲了研究目的!!)我試圖找到某個ByteCode序列的內存地址 – computereasy