3

以下のように単純なプログラムのプロファイルを作成したところ、多数の char[] インスタンスが作成されることがわかりました。ここで char[] インスタンスは通常文字列に起因することを読んだので、このプログラムがどのように当てはまるかわかりません。Thread クラスに char[] 'name' 変数があることは知っていますが、これで 10,000 個しか作成されないはずなので、追加の 35,000 個のスレッドがどこから来たのか疑問に思っています。

public class untitled {
    public static void main(String args[]){
        ArrayList<Thread> a = new ArrayList<Thread>();
        for(int i = 0; i < 10000; i++){
            Thread t1 = new Thread();
            a.add(t1);
            t1.start();
        }
    }
}

これは、メモリのプロファイリング結果のスクリーンショットです。String[] インスタンスも多数あるようです。

ここに画像の説明を入力

このプログラムを使用して、プロファイラーの他のセクションを分離しています。完全なプログラムでは、char[] インスタンスが最大 335,000 に増加します

4

1 に答える 1

0

この質問に答えるには、ヒープ ウォーカーを使用する必要があります。char[]ヒープ ウォーカーのクラス ビューでクラスを選択し、新しいオブジェクト セットを作成します。次に、参照ビューに移動し、ビュー セレクターから [蓄積された受信参照] を選択します。

ここに画像の説明を入力

その答えは、char[] オブジェクトの約 3 分の 1 がさまざまなクラスによって JVM に割り当てられた文字列に属し、3 分の 2 がスレッド名に由来するということです。

于 2013-07-24T08:01:46.363 に答える