【发布时间】:2013-10-18 15:12:17
【问题描述】:
最近我在做一个关于JVM和字节码的实验。
我用这些代码sn-ps来测试。
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..”的序列(与我的私有 String 变体匹配)并找到我的代码 sn-p 的字节码序列。
但是我找不到Java标准库的字节码序列..喜欢
Java.Lang.Obeject
Java.Lang.Math
怎么了..?以我的理解,我认为我应该在JVM的堆中找到它们的字节码序列..
然后我用 JRocket 再做一次.. 使用
-Djava.compiler=NONE
打开编译器模式...但是这一次我什至无法在堆上找到我的字符串变体....
我被困在这里两天了.. 谁能帮帮我...?我真的很感激...
谢谢!
【问题讨论】:
-
“字节码序列”到底是什么意思?我不明白为什么当你运行一个不使用该类的程序时,你期望在堆中找到
java.lang.Math。常量字符串的序列只是加载类时临时存在的临时工件。在创建String实例(使用不同的表示形式,通常是 UTF-16 字符数组)之后,内存可能会用于其他目的。 -
您好 Holger,感谢您的回复,我想我可以通过找到加载的 Java 标准库的确切地址来对 ByteCode 进行 ROP...
-
标准库通常没有固定的形式,也没有完全加载到JVM中。并且 JVM 运行时中的字节码序列与 jar 中的类文件中的字节码序列不同。 JVM 对字节码执行转换以减少内存消耗(例如通过共享常量)并提高性能(例如通过使用额外的非标准 JVM 特定操作码)。你不太可能找到你要找的东西。
-
@Holger 是的,它确实有很多复杂性......:(你能不能给我提供一些关于“额外的非标准 JVM 特定操作码”的文章......?我非常感谢您的帮助...
标签: java jvm bytecode jvm-hotspot jrockit