【问题标题】:memory leak issue on using java substring method使用 java 子字符串方法的内存泄漏问题
【发布时间】:2013-06-28 07:02:11
【问题描述】:

我已经查看了 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:字符串。上面的循环一直运行到数组列表中的所有字符串都被索引为止。我试图通过以下方式修复泄漏,

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。

编辑:

我知道这不是 cmets 的内存泄漏问题。我正在索引一些连续的字符串。比如说,

String s= abcdefghijkl;

我想将每个字符串索引为:

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

为此,我获取一个字符串,然后执行子字符串操作,获取该字符串并对其进行索引。

【问题讨论】:

  • 您是如何发现有泄漏的?
  • 是的,您确定这是泄漏而不是大量使用内存吗?您是否尝试过增加堆大小?还请发布一个SSCCE 来演示泄漏。
  • 你为什么要这样做?这看起来像一个 XY 问题。是否愿意准确说出您想要实现的目标?

标签: java memory-leaks substring


【解决方案1】:

没有泄漏。

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

真的需要创建这么多String 对象吗?例如可以使用char[] 来实现您想要的吗?

【讨论】:

    【解决方案2】:

    有两件事:

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

    第二个:String 中有一个构造函数采用 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);
    }
    

    -> 这也更有效(就速度而言)

    【讨论】:

      【解决方案3】:

      在 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-03
        • 2011-08-29
        • 2011-08-29
        • 2014-04-30
        • 1970-01-01
        • 1970-01-01
        • 2021-03-28
        • 2013-10-16
        相关资源
        最近更新 更多