1

Java部分文字列メソッドのメモリリークソリューションをすべて調べました。この問題が原因で、メモリ不足エラーが引き続き発生します。長さが 1000 ~ 3500 の文字列の配列リストがあります。それらにインデックスを付けて保存します。問題は、同じ文字列の可能なすべての可変長を格納するために、各文字列をループで実行する必要があることです。これを行うには、for ループと部分文字列メソッドを使用します。このメソッドは、メモリ リークの問題を引き起こします。

私がやったことのsudoコード:

for(int i=0;i<str.length;i++)
{
    //create substring and index it
    str.substring(0,(str.length()-i));
}

str: 文字列。上記のループは、arraylist 内のすべての文字列にインデックスが付けられるまで実行されます。漏れを直そうとしたのですが、

1.

for(int i=0;i<str.length;i++)
{
    //create substring and index it
    new String(str.substring(0,(str.length()-i)));
}

2.

for(int i=0;i<str.length;i++)
{
    //create substring and index it
    new String(str.substring(0,(str.length()-i)).intern());
}

3.

for(int i=0;i<str.length;i++)
{
    //create substring and index it
    new String(str.substring(0,(str.length()-i))).intern();
}

それでも問題があります。私の Java バージョンは 1.7.0_17 です。

編集:

これはコメントからのメモリリークの問題ではないことを理解しています。いくつかの連続した文字列にインデックスを付けています。たとえば、

String s= abcdefghijkl;

各文字列を次のようにインデックス付けしたい:

abcdefghjk
abcdefghj
abcdefhg
abcdefh
abcdef
abcde
abcd
..
..
a

これを実行するには、文字列を取得し、部分文字列操作を実行し、その文字列を取得してインデックスを付けます。

4

3 に答える 3

4

漏れはありません。

大量のStringオブジェクトを作成していることに注意してください。aStringの長さが 1000 文字の場合、1000 個のオブジェクトを作成しています。

Stringこれほど多くのオブジェクトを作成する必要は本当にあるのでしょうか? たとえば、 a を使用して目的を達成することは可能char[]でしょうか?

于 2013-06-28T07:10:27.547 に答える
1

この問題は、文字配列の新しいコピーを返すことにより、JDK 1.7 で修正されました。

public String(char value[], int offset, int count) {
//check boundary
 // It return new copy on array.
this.value = Arrays.copyOfRange(value, offset, offset + count);
}

public String substring(int beginIndex, int endIndex) {
//check boundary
int subLen = endIndex - beginIndex;
return new String(value, beginIndex, subLen);
}

http://javaexplorer03.blogspot.in/2015/10/how-substring-memory-leak-fixed-in-jdk.html?q=itself+implements+Runnable

于 2015-10-28T13:25:34.303 に答える
1

2 つのことがあります。

最初: ".intern()" は、通常はガベージ コレクションされない内部キャッシュに文字列を保持します。使用する理由が 100% わからない場合は使用しないでください。

2 番目: 次のように char[] を取る String からのコンストラクターがあります。

final char[] chars = str.toCharArray ();
for(int i=0;i<chars.length;i++)
{
    //create substring and index it
    new String(chars, 0, chars.length-i);
}

-> これもより効率的です (速度の点で)

于 2013-06-28T07:38:23.623 に答える