[解決済み] Stringに""を付けると、なぜメモリが節約できるのですか?
質問
たくさんのデータが入った変数、例えば
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()
は期待通りに動作します。
関連
-
undefinedeclipse エラー。この行に複数のアノテーションが見つかりました: - 文字列を型解決に解決できない
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スタイルが読み込まれず、ブラウザのコンソールでエラーが報告される。リソースはスタイルシートとして解釈されますが、MIMEタイプtext/htmlで転送されます。
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
IllegalArgumentException この例外を解決する方法
-
jd-gui Java Exceptionが発生しました。
-
プロローグでのコンテンツは禁止されています
-
JDKの設定時にjava.dllが見つからない、java SE Runtime Environmentが見つからない問題が発生しました。
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
linux run jarfile Invalid or corrupt jarfile error.
-
HttpClientがGZIP形式でない場合の対処法
-
テストが見つかりませんでした