14

このブログ投稿では、文字列の最小メモリ使用量は次のようになっていると言われています。

8 * (int) ((((no chars) * 2) + 45) / 8)バイト。

したがって、文字列「Apple Computers」の場合、最小メモリ使用量は72バイトになります。
その2倍の長さの文字列オブジェクトが10,​​000個ある場合でも、メモリ使用量は2Mb未満になり、それほど多くはありません。つまり、エンタープライズアプリケーションに存在する文字列の量を過小評価しているということですか、それともその式が間違っているのでしょうか。

ありがとう

4

3 に答える 3

17

Javaでの文字列ストレージは、文字列の取得方法によって異なります。バッキングcharアレイは、複数のインスタンス間で共有できます。そうでない場合は、通常のオブジェクトオーバーヘッドに加えて、1つのポインターと3つintのストレージ用のストレージがあり、通常は16バイトのオーバーヘッドになります。sはUTF-16コード単位であるcharため、バッキング配列には1バイトあたり2バイトが必要です。char

バッキングアレイが共有されていない場合"Apple Computers"、最小コストは次のようになります。

  1. 16文字のバッキング配列-単語の境界にうまく整列する32B。
  2. 配列へのポインタ-プラットフォームに応じて4または8B
  3. オフセット、長さ、メモ化されたハッシュコードの3int秒-12B
  4. 2 xオブジェクトオーバーヘッド-VMによって異なりますが、経験則として8Bが適しています。
  5. 1つintは配列の長さです。

したがって、実際のペイロードが44.4%を占める約72Bです。ペイロードは、より長い文字列に対してより多くを構成します。


Java7では、一部のJDK実装は、メモリに大きな[]を固定することを回避するために、バッキング配列共有を廃止しています。charそれは彼らが3intつののうちの2つを廃止することを可能にします。

これにより、実際のペイロードが50%を構成する長さ16の文字列の計算が64Bに変更されます。

于 2012-06-21T03:22:40.733 に答える
3

Java文字列よりも少ないメモリを使用して文字データを保存することは可能ですか?はい。

「エンタープライズ」アプリケーション(または、はるかに少ないメモリで処理する必要があるAndroidまたはJ2MEアプリケーション)にとって重要ですか?ほとんどは決してない。

時期尚早の最適化が根本です...

于 2012-06-21T03:25:10.173 に答える
1

あなたが持っている他のデータ型と比較して、それは間違いなく高いです。他のプリミティブは32ビット、64ビットなどを使用します。

そして、それStringが不変であることを考えると、オブジェクトに対して操作を実行するたびに、新しいStringオブジェクトを作成することになり、さらに多くのメモリを消費します。

于 2012-06-21T03:22:28.687 に答える