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に変更されます。