最近我正在做一個關於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
打開編譯模式......但這一次,我甚至無法在堆上找到我的字符串變體....
我被困在這裏兩天..有人能幫我嗎?我真的很感激它...
謝謝!
「字節碼序列」是什麼意思?我不明白爲什麼當你運行一個不使用該類的程序時,你希望在堆內找到java.lang.Math'。常量字符串的序列只是在加載類時臨時存在的臨時工件。在創建了String實例之後(它使用不同的表示形式,通常是UTF-16字符數組),該內存可能被用於其他目的。 – Holger
嗨Holger,感謝您的回覆,我想我可以通過查找加載的Java標準庫的確切地址來做一個ROP到ByteCode ... – computereasy
標準庫既沒有固定格式,也沒有完全加載到通常是JVM。 JVM運行時內的字節碼序列將不會與jar中的類文件相同。JVM對字節碼進行轉換以減少內存消耗(例如通過共享常量)並提高性能(例如,通過使用其他非標準JVM特定的操作碼)。你很難找到你想要的東西。 – Holger