加载库类后,JVM做了什么?

时间:2013-10-18 15:12:18

标签: java jvm bytecode jvm-hotspot jrockit

最近我正在对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 ..”(这与我的私有String变体匹配)并找到我的代码片段的字节码序列。

但是我找不到Java标准库的字节码序列..比如

Java.Lang.Obeject
Java.Lang.Math

出了什么问题......?根据我的理解,我认为我应该在JVM的堆中找到它们的字节码序列..

然后我再用JRocket来做..使用

   -Djava.compiler=NONE

转换编译器模式......但这次我甚至无法在堆上找到我的String变体....

我被困在这里两天..有人可以给我一些帮助......?我真的很感激...

谢谢!

1 个答案:

答案 0 :(得分:1)

  

我被困在这里两天..有人可以给我一些帮助......?我真的很感激...

我会专注于您首先尝试解决的问题。也许你可以更明确地说明你为什么要在这个问题上这样做。

  

在Windows上,我删除-Djava.compiler = NONE

这只会改变代码编译为本机代码的方式。这不会以任何方式改变堆。

  

但是我找不到Java标准库的字节码序列..比如

字节代码和类定义不在堆中,它们位于perm gen中。