1

私の J2ME コードには、次のようなループがあります。

 Enumeration jsonEnumerator = someJSONObject.keys();

while(jsonEnumerator.hasMoreElements()){

String key = (String) jsonEnumerator.nextElement();
String value = someJSONObject.getJSONObject(key);
someOtherJson.put(value,key);
}

上記のコードで文字列の割り当てを考慮すると

String key = (String) jsonEnumerator.nextElement(); 

新しいオブジェクトをインスタンス化する代わりに文字列のプールを使用するのは正しいアプローチですか、それともメモリリークを回避する文字列を割り当てる他のアプローチは何ですか?

4

4 に答える 4

2

文字列の割り当てによってメモリ リークが発生することはありません。

そのコードの他の場所で文字列がリークするかどうかは、このコードからは識別できないいくつかのことに依存します。

  • JSON 実装がキーと値の文字列を作成する方法。(String.substring()はるかに大きな文字列で使用している場合、共有文字列バッキング配列を介してストレージをリークする可能性があります。)
  • someOtherJsonがリークされているかどうか。

(Java SE での) 通常のアプローチは、メモリ プロファイリングからリークがあるという証拠が得られるまでは、気にしないことです。Java ME 実装では、通常、メモリはより制約されており、GC 実装は比較的遅くなる可能性があります。そのため、オブジェクト (文字列を含む) の数とサイズを減らす必要がある場合があります。しかし、それはメモリ リークの問題ではありません...そして、労力の無駄になりかねないメモリ効率キャンペーンに飛びつくよりも、最初にプロファイリングを行うことをお勧めします。


新しいオブジェクトをインスタンス化する代わりに文字列のプールを使用するのは正しいアプローチですか、それともメモリリークを回避する文字列を割り当てる他のアプローチは何ですか?

私が言ったように、上記のコードにはリークはありません。

文字列プールはリークをなくすわけではなく、必ずしもガベージ オブジェクトの作成率を下げるわけではありません。ライブ String オブジェクトの数をいつでも減らすことができますが、これには代償が伴います。

このアプローチを試してみたい場合はString.intern()、String プールの管理に使用するのが最も簡単です。しかし、必ずしも役立つとは限りません。そして、実際に事態を悪化させる可能性があります。(共有の可能性が十分にない場合、インターンされた文字列プールのスペース オーバーヘッドが節約を超える可能性があります。さらに、インターンされた文字列プールは、GC により多くの作業を作成します。より多くのトレースと、より効果的に対処する弱い参照です。 )

于 2013-01-21T11:33:16.957 に答える
1

いいえ、文字列の割り当て自体は何も作成しません。Java での「リーク」に似ている唯一のことは、大量の参照を配列または他の構造に入れ、それを忘れた場合です。構造を「ライブ」(アクセス可能) のままにしておきますが、使用しないでください。

于 2013-01-21T13:07:32.033 に答える
0

文字列のインターンについて話している場合は、ここでは発生しません。ソースコードで見つかった定数文字列に対してのみ自動的に発生します。

その他の文字列は、他のオブジェクトと同様にガベージ コレクションされます。

于 2013-01-21T11:35:32.930 に答える
-2

私の提案は次のとおりです。

Enumeration jsonEnumerator = someJSONObject.keys();

while(jsonEnumerator.hasMoreElements()) {
    String key = (String) jsonEnumerator.nextElement();
    someOtherJson.put(someJSONObject.getJSONObject(key), key);
}

文字列のインスタンス化により、J2ME でメモリ リークが発生します。これは、J2ME が不適切なガベージ コレクション メソッドを使用してリソースの使用量を削減するためです。

J2ME アプリケーションを開発する場合は、メモリと CPU の使用量に注意してください。

于 2013-01-21T11:17:35.330 に答える