使用java子字符串方法时的内存泄漏问题

使用java子字符串方法时的内存泄漏问题,java,memory-leaks,substring,Java,Memory Leaks,Substring,我已经浏览了java子字符串方法的所有内存泄漏解决方案。由于这个问题,我仍然出现内存不足错误。我有一个长度为1000-3500的字符串数组列表。我为它们编制索引并存储它们。问题是每个字符串都需要在循环中运行,以存储相同字符串的所有可能的不同长度。为此,我使用for循环和子字符串方法。这种方法会导致内存泄漏问题 我所做的sudo代码: for(int i=0;i<str.length;i++) { //create substring and index it str.sub

我已经浏览了java子字符串方法的所有内存泄漏解决方案。由于这个问题,我仍然出现内存不足错误。我有一个长度为1000-3500的字符串数组列表。我为它们编制索引并存储它们。问题是每个字符串都需要在循环中运行,以存储相同字符串的所有可能的不同长度。为此,我使用for循环和子字符串方法。这种方法会导致内存泄漏问题

我所做的sudo代码:

for(int i=0;i<str.length;i++)
{
    //create substring and index it
    str.substring(0,(str.length()-i));
}
我希望将每个字符串索引为:

abcdefghjk
abcdefghj
abcdefhg
abcdefh
abcdef
abcde
abcd
..
..
a
要执行此操作,我获取一个字符串,然后执行子字符串操作,获取该字符串并为其编制索引。

没有泄漏

请注意,您正在创建大量
String
对象。如果
字符串
的长度为1000个字符,则将创建1000个对象

真的需要创建这么多
String
对象吗?例如,是否可以使用
char[]
来获得您想要的内容?

没有泄漏

请注意,您正在创建大量
String
对象。如果
字符串
的长度为1000个字符,则将创建1000个对象

真的需要创建这么多
String
对象吗?例如,是否可以使用
char[]
来获得您想要的内容?

有两件事:

首先:“.intern()”将字符串保存在通常不会被垃圾收集的内部缓存中-如果您不能100%确定使用它的原因,请不要使用它

第二:字符串中有一个构造函数采用char[],如下所示:

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);
}
final char[]chars=str.tocharray();
对于(int i=0;i),这也更有效(就速度而言)

有两件事:

首先:“.intern()”将字符串保存在通常不会被垃圾收集的内部缓存中-如果您不能100%确定使用它的原因,请不要使用它

第二:字符串中有一个构造函数采用char[],如下所示:

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);
}
final char[]chars=str.tocharray();

对于(int i=0;i),这也更有效(就速度而言)

这个问题在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);
}

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

您是如何发现泄漏的?是的,您确定这是泄漏而不仅仅是内存的大量使用吗?您是否尝试过增加堆大小?请同时发布一篇演示泄漏的文章。您首先为什么要这样做?这看起来像一个XY问题。您想确切地告诉我们您想要实现什么吗?您是如何发现泄漏的有漏洞吗?是的,你确定这是漏洞而不仅仅是内存的大量使用吗?你是否尝试过增加堆大小?请同时发布一篇演示漏洞的文章。你首先为什么要这样做?这看起来像是XY问题。你想确切地告诉我你想要实现什么吗?
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);
}
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);
}