1. ホーム
  2. java

[解決済み] Stringに""を付けると、なぜメモリが節約できるのですか?

2022-04-25 02:22:45

質問

たくさんのデータが入った変数、例えば String data . この文字列のごく一部を次のように使いたいのです。

this.smallpart = data.substring(12,18);

メモリビジュアライザーを使って)何時間かデバッグした結果、オブジェクトフィールドの smallpart のデータをすべて記憶していました。 data しかし、それは部分文字列しか含んでいない。

というコードに変更したところ。

this.smallpart = data.substring(12,18)+""; 

...問題は解決しました! これで、私のアプリケーションはほとんどメモリーを使用しなくなりました。

どうしてそんなことが可能なのでしょうか?誰か説明できますか?この.smallpartはデータに向かって参照し続けたと思うのですが、なぜでしょうか?

UPDATEしてください。 では、大きなStringをクリアするにはどうしたらよいのでしょうか?data = new String(data.substring(0,100)) で済むのでしょうか?

どのように解決するのですか?

以下を実行します。

data.substring(x, y) + ""

は新しい (小さい) String オブジェクトを作成し、substring() によって作成された String への参照を捨て、これによってこのガベージコレクションを可能にします。

重要なのは substring() へのウィンドウを提供します。 既存の 文字列というか、元の文字列の下にある文字配列です。そのため、元の文字列と同じメモリを消費します。これは状況によっては有利ですが、部分文字列を取得して元の文字列を破棄したい場合(お分かりのように)には問題があります。

を見てみましょう。 サブストリング()メソッド をJDK Stringソースに追加しました。

EDIT: 補足の質問に答えると、部分文字列から新しいStringを構築すると、メモリ消費量を減らすことができます。 提供 元の文字列への参照をすべて削除してください。

注意(2013年1月)。上記の動作は変更されました Java 7u6 では . フライウェイトパターンは使用されなくなり substring() は期待通りに動作します。