我试图了解JVM如何执行java代码。
说,我写这个java代码:
public class Hello {
public static void main(String args[])
{
int i = 42;
String hello ="World";
System.out.println(hello + i);
}
}
这是生成的字节码(使用eclipse插件):
// class version 50.0 (50)
// access flags 33
public class cmpe296/Hello {
// compiled from: Hello.java
// access flags 1
public <init>()V
L0
LINENUMBER 3 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init>()V
RETURN
L1
LOCALVARIABLE this Lcmpe296/Hello; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 9
public static main([Ljava/lang/String;)V
L0
LINENUMBER 7 L0
LDC "World"
ASTORE 1
L1
LINENUMBER 8 L1
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 1
INVOKEVIRTUAL java/io/PrintStream.println(Ljava/lang/String;)V
L2
LINENUMBER 9 L2
RETURN
L3
LOCALVARIABLE args [Ljava/lang/String; L0 L3 0
LOCALVARIABLE hello Ljava/lang/String; L1 L3 1
MAXSTACK = 2
MAXLOCALS = 2
}
这是我获得的关于java代码的唯一信息。但我有兴趣跟踪这个java代码的生命周期。即当我定义:int i = 42
时,调用JVM(open jdk)实现的c ++方法。
是否有任何工具可用于从上到下分析Java代码(直到汇编语言生成)?
我在这里找到的东西:Google code of openjdk
答案 0 :(得分:3)
对于初步分析,您可以在执行应用程序时使用-verbose选项
-verbose [:类| GC | JNI]
示例:
java -verbose:jni Hello
希望这有帮助
答案 1 :(得分:2)
是否有任何工具可用于从上到下分析Java代码(直到汇编语言生成)?
不是你想要的程度,AFAIK。根本不需要这样的工具来证明建立一个工具的合理性。
理论上,您可以使用C / C ++源代码级调试器构建和运行JVM。但是我怀疑你需要很长时间才能看到Java语句执行时会发生什么。
另一种方法是挖出JVM选项,告诉JIT编译器转储它发出的本机代码,然后反汇编本机代码。但这只能告诉你一小部分答案。
无论哪种方式,我都不会看到你将如何学习特别相关的内容......除非你计划实现自己的Java代码生成工具。而你所学到的任何东西都可能是短暂的;即Java 7出现时已过时。
<强>后续强>
对于您要做的事情(研究“从pascal VM到JVM的HLL VM的演变。”),您可能正在浪费时间钻研JVM的内部。通过查找和阅读有关该主题的研究论文,文章和开发者博客,您将获得更好的图片和更快的图片。 (请咨询您的主管。)如果您发现文献未充分涵盖的具体要点......可能值得深入了解实施情况。但在那时你会更好地了解你应该寻找什么。
相信我......我自己也做过这种事。