私はこれを調べていましたが、Javaがオブジェクトのサイズを見つけるための構造を提供しているのだろうかと思っていました。
3 に答える
残念ながら違います。比較的複雑です。たとえば、String
オブジェクトを作成する場合は、次のことを考慮する必要があります。
- オブジェクトのフィールドのサイズ。プリミティブなどの場合、それは簡単です
- 参照されるオブジェクトのサイズ。各メンバーオブジェクトは参照であり、実際には問題のオブジェクト内に排他的に含まれているわけではありません。たとえば
String
、char配列への参照が含まれていますが、そのchar配列は複数で共有できます(方法を理解するStrings
には、のソースを参照してください-これはフライウェイトパターンとして知られています)substring()
- JVM内のネイティブ実装の詳細のサイズ
いいえ。それは言語の概念に反します。実際のオブジェクト指向プログラミング言語(C ++のようなハッキングされたOOPサポートではありません)では、オブジェクトは抽象的な概念であり、コンピューター上のビットではありません。オブジェクトをシリアル化するまで、およびシリアル化しない限り、ビットのシーケンスではなく、実際のオブジェクトのように扱われます。
実際には、Instrumentationクラスを使用してオブジェクトのサイズを取得できると思いますが、プロセスは、 1つはC++で、sizeof()関数を使用します。
欠点の1つは、オブジェクトのサイズは取得できますが、参照されているオブジェクトのサイズは取得できないことです(存在する場合)。
別の方法は、テスト対象のオブジェクトをシリアル化してファイルに書き込み、ファイルのサイズを設定することです(ObjectOutputStreamを使用してそのサイズを取得します)。この主題に関連する詳細なドキュメントについては、以下をお読みください。一般的なJavaエージェントとJavaプロービングについて少し説明します。JVMのプロービングは、パフォーマンス(オブジェクトのサイズ、実行中のスレッド、メモリリークなど)を分析する場合に特に役立ちます。