Javaでの文字列ストレージは、文字列の取得方法によって異なります。バッキングchar
アレイは、複数のインスタンス間で共有できます。そうでない場合は、通常のオブジェクトオーバーヘッドに加えて、1つのポインターと3つint
のストレージ用のストレージがあり、通常は16バイトのオーバーヘッドになります。sはUTF-16コード単位であるchar
ため、バッキング配列には1バイトあたり2バイトが必要です。char
バッキングアレイが共有されていない場合"Apple Computers"
、最小コストは次のようになります。
- 16文字のバッキング配列-単語の境界にうまく整列する32B。
- 配列へのポインタ-プラットフォームに応じて4または8B
- オフセット、長さ、メモ化されたハッシュコードの3
int
秒-12B
- 2 xオブジェクトオーバーヘッド-VMによって異なりますが、経験則として8Bが適しています。
- 1つ
int
は配列の長さです。
したがって、実際のペイロードが44.4%を占める約72Bです。ペイロードは、より長い文字列に対してより多くを構成します。
Java7では、一部のJDK実装は、メモリに大きな[]を固定することを回避するために、バッキング配列共有を廃止しています。char
それは彼らが3int
つののうちの2つを廃止することを可能にします。
これにより、実際のペイロードが50%を構成する長さ16の文字列の計算が64Bに変更されます。