4

このヒープダンプを考えると

size         no. of obj class
515313696       2380602 char[]
75476832        614571  * ConstMethodKlass
57412368        2392182 java.lang.String
44255544        614571  * MethodKlass
33836872        70371   * ConstantPoolKlass
28034704        70371   * InstanceKlassKlass
26834392        349363  java.lang.Object[]
25853848        256925  java.util.HashMap$Entry[]
24224240        496587  * SymbolKlass
19627024        117963  byte[]
18963232        61583   * ConstantPoolCacheKlass
18373920        120113  int[]
15239352        634973  java.util.HashMap$Entry
11789056        92102   ph.com.my.class.Person

そして、私のアプリからのクラスは1つだけですph.com.my.class.Person。クラス定義は次のとおりです。

public class Person {
 private String f_name;
 private String l_name;
}

ヒープダンプにはPerson size (11789056)、2つの文字列変数が占めるメモリが含まれていますか?または、代わりにクラスでカウントされf_nameますか?この場合はサイズ57412368ですか?l_nameString

更新-フォローアップの質問を追加しました:

したがって、次の各インスタンスについて考えてみましょう。

  1. f_nameのサイズは30です
  2. l_nameのサイズは20です
  3. 人のサイズは75です

Personのインスタンスが10個ある場合、

  1. 10 *(30 + 20)= 500
  2. 10 * 75 = 750

500はStringまたはchar[]でカウントされますか?そしてその後、750は人に数えられますか?

4

2 に答える 2

2

各カウントとサイズは、そのオブジェクトのサイズです。-histoこれの代わりに使用した場合-histo:live、参照されていないオブジェクトも含め、すべてのオブジェクトになります。

注:それぞれStringにがchar[]あり、JVMはこれらのかなりの数を使用します。Stringサイズはオブジェクト自体のサイズであり、オブジェクト自体のサイズではありませんchar[]

于 2012-07-19T09:02:03.693 に答える
2

ヒープダンプ内のオブジェクトのサイズは、そのインスタンスを保持するためにヒープ上のブロックとして割り当てられたバイト数です。オブジェクトを介して到達可能なグラフ全体のバイトが含まれることはありません。一般に、これは、オブジェクトのサイズがヒープ全体であることを簡単に意味する可能性があります。したがって、あなたの場合、2つの参照は考慮されますが、Stringインスタンス自体は考慮されません。Stringサイズでさえ、表現された文字列のサイズを反映していないことにも注意してください-それはに格納されていchar[]ます。char[]インスタンスは文字列間で共有されるため、ストーリーはそれほど単純ではありません。

于 2012-07-19T09:02:33.703 に答える