Java オブジェクトが占めるバイト数を計算する方法

高洛峰
リリース: 2017-01-05 17:30:41
オリジナル
1606 人が閲覧しました

この記事の例では、Java オブジェクトが占有するメモリ量を計算 (または推定) する方法を説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです:

通常、私たちが話すヒープメモリ使用量の前提は、「一般的な状況」の背景に基づいています。次の 2 つの状況は除きます。

場合によっては、JVM はオブジェクトをヒープにまったく配置しません。例: 原則として、小さなスレッドローカル オブジェクトはヒープではなくスタック上に存在します。
オブジェクトが占有するメモリのサイズは、オブジェクトの現在の状態によって異なります。例: オブジェクトの同期ロックが有効かどうか、またはオブジェクトがリサイクルされているかどうか。
まず、ヒープ内で単一のオブジェクトがどのように見えるかを見てみましょう

ヒープ内では、各オブジェクトは 4 つのフィールド (A、B、C、D) で構成されます。以下で 1 つずつ説明します。
A: オブジェクト ヘッダー。占有バイト数は非常に少なく、オブジェクトの現在の状態に関する情報を表します。 B: 基本型フィールドが占めるスペース (ネイティブ フィールドは、int、boolean、short などを参照します)。参照型フィールド (参照型) が占有する領域。ドメインは他のオブジェクトへの参照を参照し、各参照は 4 バイトを占有します)
D: フィラーが占有する領域 (フィラーとは何かについては後で説明します)

A、B について説明しましょう。 、C と D を 1 つずつ

A: オブジェクト ヘッダー

メモリ内で、各オブジェクトが占める合計スペースには、オブジェクト内で宣言された変数に必要なスペースだけでなく、オブジェクト ヘッダーやフィラーなどの追加情報も含まれます。 。 「オブジェクト ヘッダー」の機能は、オブジェクトのインスタンス名、ID、インスタンス ステータス (たとえば、現在のインスタンスが「到達可能」かどうか、現在のロックのステータスなど) を記録することです。

現在の JVM バージョン (ホットスポット) では、「オブジェクト ヘッダー」が占めるバイト数は次のとおりです:


通常のオブジェクトは 8 バイトを占有します
配列は、通常のオブジェクトの 8 バイト + 4 バイトを含む 12 バイトを占有します(配列長)

B: 基本型

Booleanとbyteが1バイト、charとshortが2バイト、intとfloatが4バイト、longとdoubleが8バイト


C: 参照型
各参照型が占有4 バイト

D: Filler
ホットスポットでは、各オブジェクトが占める合計スペースは 8 の倍数として計算されます。オブジェクト (オブジェクト ヘッダー + 宣言された変数) が占める合計スペースが 8 の倍数未満の場合、自動的に入力されます。ただし、これらの塗りつぶされたスペースを「フィラー」と呼ぶこともできます。具体的な例を見てみましょう:

空のオブジェクト (変数が宣言されていない) は 8 バイトを占有します --> オブジェクト ヘッダーは 8 バイトを占有します

ブール型変数を宣言しただけのクラスは 16 バイトを占有します --> ( 8 バイト) + ブール値 (1 バイト) + フィラー (7 バイト)
8 つのブール型変数を宣言するクラスは 16 バイトを消費します --> オブジェクト ヘッダー (8 バイト) + ブール値 (1 バイト) * 8

上記の例は、Java プログラミングについての理解を深めるのに役立ちます。

Java オブジェクトが占めるバイト数を計算する方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート