0

最近、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

コンパイラモードをオフにするには...しかし、今回はヒープ上で文字列バリアントを見つけることさえできません....

私はここに 2 日間閉じ込められています..誰か助けてくれませんか..?本当に本当に感謝しています...

ありがとうございました!

4

1 に答える 1

1

私はここに 2 日間閉じ込められています..誰か助けてくれませんか..?本当に本当に感謝しています...

最初に解決しようとしている問題に焦点を当てます。おそらく、質問でこれを行っている理由をより明確にすることができます。

Windows では、 -Djava.compiler=NONE をオフにします。

これは、コードがネイティブ コードにコンパイルされる方法を変更するだけです。これにより、ヒープが変更されることはありません。

しかし、Java標準ライブラリのバイトコードシーケンスが見つかりません..のように

バイトコードとクラス定義はヒープではなく、perm gen にあります。

于 2013-10-18T15:17:02.310 に答える