2013-06-28 66 views
1

我已經瀏覽了所有用於java子串方法的內存泄漏解決方案。由於這個問題,我仍然得到了內存不足的錯誤。我有一個長度爲1000-3500的字符串數組列表。我索引它們並存儲它們。問題是每個字符串都需要通過循環運行來存儲所有可能的不同長度的相同字符串。爲此,我使用循環和子串方法。並且此方法導致內存泄漏問題。關於使用java子串方法的內存泄漏問題

的什麼我已經做了須藤代碼:

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

STR:字符串。並且這個循環運行直到數組列表中的所有字符串都被索引。我試圖修復被泄漏,

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 

要執行此,我得到一個字符串,然後進行串操作,獲取該字符串,並對其進行索引。

+1

你是怎麼發現有泄漏? – UmNyobe

+2

是的,你確定它是一個泄漏,而不僅僅是大量的內存使用嗎?你有沒有嘗試增加你的堆大小?請同時發佈證明泄漏的[SSCCE](http://www.sscce.org)。 –

+2

你爲什麼要這麼做呢?這看起來像一個XY問題。謹慎地告訴你想要達到的目標嗎? – fge

回答

4

沒有泄漏。

請注意,您正在創建大量的String對象。如果String的長度爲1000個字符,那麼您將創建1000個對象。

是否真的需要創建如此多的String對象?例如,是否可以使用char[]來達到你想要的效果?

1

有兩件事情:

第一:「.intern()」保持在內部緩存通常不是垃圾收集的字符串 - 如果你不知道爲什麼100%,請不要使用它你正在使用它。

第二:存在從字符串服用炭[]像這樣的構造:

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); 
} 

- >這也是更有效的(在速度方面)

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