从上到下理解JVM中的Java代码生命周期

时间:2010-12-06 01:55:01

标签: java jvm analysis

我试图了解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代码(直到汇编语言生成)?

具体来说我的问题是:

  1. JVM如何解释字节码
  2. 调用了哪个c ++代码?
  3. 我在这里找到的东西:Google code of openjdk

2 个答案:

答案 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的内部。通过查找和阅读有关该主题的研究论文,文章和开发者博客,您将获得更好的图片和更快的图片。 (请咨询您的主管。)如果您发现文献未充分涵盖的具体要点......可能值得深入了解实施情况。但在那时你会更好地了解你应该寻找什么。

相信我......我自己也做过这种事。