この記事の例では、Java オブジェクトが占有するメモリ量を計算 (または推定) する方法を説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです:
通常、私たちが話すヒープメモリ使用量の前提は、「一般的な状況」の背景に基づいています。次の 2 つの状況は除きます。
場合によっては、JVM はオブジェクトをヒープにまったく配置しません。例: 原則として、小さなスレッドローカル オブジェクトはヒープではなくスタック上に存在します。
オブジェクトが占有するメモリのサイズは、オブジェクトの現在の状態によって異なります。例: オブジェクトの同期ロックが有効かどうか、またはオブジェクトがリサイクルされているかどうか。
まず、ヒープ内で単一のオブジェクトがどのように見えるかを見てみましょう
ヒープ内では、各オブジェクトは 4 つのフィールド (A、B、C、D) で構成されます。以下で 1 つずつ説明します。
A: オブジェクト ヘッダー。占有バイト数は非常に少なく、オブジェクトの現在の状態に関する情報を表します。 B: 基本型フィールドが占めるスペース (ネイティブ フィールドは、int、boolean、short などを参照します)。参照型フィールド (参照型) が占有する領域。ドメインは他のオブジェクトへの参照を参照し、各参照は 4 バイトを占有します)
D: フィラーが占有する領域 (フィラーとは何かについては後で説明します)
A、B について説明しましょう。 、C と D を 1 つずつ
メモリ内で、各オブジェクトが占める合計スペースには、オブジェクト内で宣言された変数に必要なスペースだけでなく、オブジェクト ヘッダーやフィラーなどの追加情報も含まれます。 。 「オブジェクト ヘッダー」の機能は、オブジェクトのインスタンス名、ID、インスタンス ステータス (たとえば、現在のインスタンスが「到達可能」かどうか、現在のロックのステータスなど) を記録することです。
現在の JVM バージョン (ホットスポット) では、「オブジェクト ヘッダー」が占めるバイト数は次のとおりです:
通常のオブジェクトは 8 バイトを占有します
配列は、通常のオブジェクトの 8 バイト + 4 バイトを含む 12 バイトを占有します(配列長)
B: 基本型
C: 参照型
各参照型が占有4 バイト
D: Filler
ホットスポットでは、各オブジェクトが占める合計スペースは 8 の倍数として計算されます。オブジェクト (オブジェクト ヘッダー + 宣言された変数) が占める合計スペースが 8 の倍数未満の場合、自動的に入力されます。ただし、これらの塗りつぶされたスペースを「フィラー」と呼ぶこともできます。具体的な例を見てみましょう:
ブール型変数を宣言しただけのクラスは 16 バイトを占有します --> ( 8 バイト) + ブール値 (1 バイト) + フィラー (7 バイト)
8 つのブール型変数を宣言するクラスは 16 バイトを消費します --> オブジェクト ヘッダー (8 バイト) + ブール値 (1 バイト) * 8
上記の例は、Java プログラミングについての理解を深めるのに役立ちます。
Java オブジェクトが占めるバイト数を計算する方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。