Javaの学習の開始時に、継承の概念を知って、サブクラスは、プロパティを継承し、プライベートとデフォルトの親クラス(ないときは、パッケージ内の)それ以外の場合は。その時私は親と子のクラスを理解していなかったプロパティの値を維持するために、しかし、JOLを理解する方法です、最終的には長い心の問題に悩まさを解決する機会を持っています。
同時に親オブジェクトを作成し、サブクラスのオブジェクトがあるため、その場合には、私はそれを疑うこの文の親クラスのオブジェクトにサブニードルポイントを持つことになりますときに、サブクラスのオブジェクトを作成するときにまず第一に、インターネットは、言いました、そして、あなたは多くのオブジェクトがあるときに出て作成されたオブジェクトを作成し、この設計はあまりにも無駄なメモリです。JOLはかどうかのケースを検証するために今日使用しました。(注:この実験の目的のサイズはポインタの圧縮は、ポインタがこの実験の結果に影響を与えない場合に基づいているが、しかし、オブジェクトの異なる大きさの、圧縮されていません)
まず、あなたはパッケージをインポートする必要がありますJOL
<依存性> <のgroupId> org.openjdk.jol </のgroupId> <たartifactId> JOLコア</たartifactId> <バージョン> 0.9 </バージョン> </依存>
その後、我々は最初の質問を見て:どのように大規模なクラスオブジェクトのオブジェクトのメモリ
パブリッククラスJolTest { パブリック静的無効メイン(文字列[] args){ O =新しいオブジェクト(オブジェクト); System.out.println(ClassLayout.parseInstance(O).toPrintable())。 } }
上記のコードは次のような結果が実行されます
対象は、16バイトの最初のオブジェクトの最初の12バイトを占めることがわかる、4バイトの整数倍のデータアライメントのJavaに追加されるが、常にJavaオブジェクトのサイズ8を使用しました
その後、我々は彼がメモリ内にあるものを見るために、int型の変数を含むクラスを作成しよう
パブリック クラスJolTest { 公共 静的 ボイドメイン(文字列[]引数){ オブジェクトO = 新しい親()。 System.out.println(ClassLayout.parseInstance(O).toPrintable())。 } } クラスの親{ プライベート int型の年齢; }
次のように実行結果があります
まだ16バイトであるが、その差は12〜15で、これは4つのアライメントが、int型ではない、我々は4バイトの所持の種類を知っているint型
その後、我々は継承親は、自分の状況を見てみるというクラスを作成します
パブリック クラスJolTest { 公共 静的 ボイドメイン(文字列[]引数){ オブジェクトO = 新しい子供()。 System.out.println(ClassLayout.parseInstance(O).toPrintable())。 } } クラスの親{ プライベート int型の年齢; } クラスの子は、拡張親{ プライベート int型の年齢を、 }
唯一、我々は結果から見ることができるオブジェクトのサブクラスを取得します、サブクラスは、我々はそのサブクラスのオブジェクトを作成すると結論することができますので、ターゲットParent.ageではなく、親クラスへのポインタを持っていますが、子クラスオブジェクトは、それが、私有財産である場合でも、親クラスの属性が含まれている場合でも、同じ名前と親クラスのプロパティのプロパティ
今、私は私が望んでいた答えを得たかわからない、と3付加的な利点があります。
((12 + +サイズ属性は、その大きさは、上位クラス+ 4)/ 8のすべての属性)* 8:1.オブジェクトのサイズを計算する方法(ポインタ圧縮を有効)
2.別の継承の深さの基礎をサポートしていない、親クラスのプロパティは、オブジェクトの大きさに影響を与えます使用されることはありません。
3.オブジェクトが、それはすべての後に、継承プロパティを無駄にすることができる、考えるように相続や必要性の組み合わせを使用することで、厳密な制御を必要とする場合にのみ組み合わせは、廃棄物のオブジェクトヘッダとアライメントだろう(クラスオブジェクトは、多くのを作成するプロジェクトで、一般的です)継承されたプロパティが必要に存在する場合は、オブジェクトのサイズを考慮することが、継承を使用することをお勧めします。すべての非本質的な組み合わせを使用することができる場合は、プロパティのために必要なときにオブジェクトを再作成します。