5

jol の GraphLayout クラスを使用して、オブジェクト インスタンスから参照されているオブジェクトのグラフを出力すると、出力エントリの一部に、タイプと参照パスの代わりに「(something else)」と表示されます。たとえば、20 個のランダムな Integer オブジェクトのリストのグラフを出力する次のコードを考えてみましょう。

List<Integer> foo = new Random().ints(20).boxed().collect(Collectors.toList());
System.out.println(GraphLayout.parseInstance(foo).toPrintable());

このコードは次を出力します。

java.util.ArrayList object externals:
          ADDRESS       SIZE TYPE                PATH                           VALUE
         d642ecc8         24 java.util.ArrayList                                (object)
         d642ece0         16 java.lang.Integer   .elementData[0]                212716192
         d642ecf0         56 (something else)    (somewhere else)               (something else)
         d642ed28         16 java.lang.Integer   .elementData[1]                1503736768
         d642ed38         16 java.lang.Integer   .elementData[2]                -2099759732
         d642ed48         16 java.lang.Integer   .elementData[3]                445566433
         d642ed58         16 java.lang.Integer   .elementData[4]                -1528625708
         d642ed68         16 java.lang.Integer   .elementData[5]                -555424299
         d642ed78         16 java.lang.Integer   .elementData[6]                1607595284
         d642ed88         16 java.lang.Integer   .elementData[7]                763466772
         d642ed98         16 java.lang.Integer   .elementData[8]                638331919
         d642eda8         16 java.lang.Integer   .elementData[9]                -1742026575
         d642edb8         16 java.lang.Integer   .elementData[10]               1920101909
         d642edc8         80 (something else)    (somewhere else)               (something else)
         d642ee18         16 java.lang.Integer   .elementData[11]               2001035318
         d642ee28         16 java.lang.Integer   .elementData[12]               -1920666937
         d642ee38         16 java.lang.Integer   .elementData[13]               -991335829
         d642ee48         16 java.lang.Integer   .elementData[14]               -47760298
         d642ee58         16 java.lang.Integer   .elementData[15]               855824902
         d642ee68        104 [Ljava.lang.Object; .elementData                   [212716192, 1503736768, -2099759732, 445566433, -1528625708, -555424299, 1607595284, 763466772, 638331919, -1742026575, 1920101909, 2001035318, -1920666937, -991335829, -47760298, 855824902, 2137884845, -226328690, 1472718384, 890105604, null, null]
         d642eed0         16 java.lang.Integer   .elementData[16]               2137884845
         d642eee0         16 java.lang.Integer   .elementData[17]               -226328690
         d642eef0         16 java.lang.Integer   .elementData[18]               1472718384
         d642ef00         16 java.lang.Integer   .elementData[19]               890105604

DuckDuckGo と Google で を検索しjol "something else"ても、有用なヒットは返されませんでした。

"(something other)" エントリは何を表していますか?

4

1 に答える 1

6

"(something else)" はまさにそれを意味します -- このオブジェクトグラフの一部ではない何か。他の (ライブまたはガベージ) オブジェクトが存在するか、VM 内部の何らかの理由でヒープにギャップが存在する可能性があります。

グラフ内のオブジェクトの表は、アドレスでソートされていることに注意してください。ArrayList のelementData配列は、最初の要素が追加されると遅延初期化され、10 番目の要素がリストに追加されると、elementDataより多くの要素のためのスペースを作るために再割り当てされます。これにより、(ガベージになった) 配列に対応するヒープ領域にギャップが作成され、jol はそれらを「(その他の)」エントリとして出力します。これらのエントリを出力するコードは、GraphLayout の 246 行目です(少なくともこの投稿の時点では)。

jol は、ヒープ ギャップに関するこの情報を出力して、ガベージ コレクターの動作を理解するのに役立てます。ArrayList から参照されるオブジェクトが最初はスパースであるが、ガベージ コレクターによって圧縮される方法を示す圧縮の例など、後のjol の例のいくつかはこれを示しています。

于 2015-05-04T00:45:27.017 に答える