java--substring内存溢出问题

Posted fly-book

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java--substring内存溢出问题相关的知识,希望对你有一定的参考价值。

public class SubStringDemo 
    //substring()
    /**
     * jdk6 当调用 substring() 方法时,创建了一个新的String对象,但是string的value[] 属性域仍然指向堆内存中的原来的那个数组。区别就是 两个对象的 count 和 offset 这两个值不同了
     * //JDK6,包级私有构造,共享 value数组提升速度
     * String(int offset, int count, char value[]) 
     *     this.value = value;
     *     this.offset = offset;
     *     this.count = count;
     * 
     *
     *
     * public String substring(int beginIndex, int endIndex) 
     *     // ... 检查边界的代码
     *     // 如果范围和自己一模一样,则返回自身,否则用value字符数组构造一个新的对象
     *     return ((beginIndex == 0) && (endIndex == count)) ? this :
     *         new String(offset + beginIndex, endIndex - beginIndex, value);
     * 
     * 如果有一个"非常"长的字符串,但每次使用substring()时只想要很小的一部分,那么将会引起另一个性能问题: 虽然你只需要很小的一部分,但是持有了整个value[]的引用,从而导致大量内存被占用。
     * 要解决这个问题,在JDK6中可以让其指向一个真正的子字符串,示例代码:
     * // x = x.substring(begin, end) + "";
     * //或 x = new String(x.substring(begin, end))
     */
    /**
     *  jdk8 在堆内存中创建了另一个字符数组
     *   public String(char value[], int offset, int count) 
     *         // ...
     *         this.value = Arrays.copyOfRange(value, offset, offset+count); //进行数组复制
     *     
     *   public String substring(int beginIndex, int endIndex) 
     *         // ...
     *         return ((beginIndex == 0) && (endIndex == value.length)) ? this
     *                 : new String(value, beginIndex, subLen);
     *     
     */

以上是关于java--substring内存溢出问题的主要内容,如果未能解决你的问题,请参考以下文章

spark内存溢出及其解决方案

java内存溢出的问题如何排查

php内存溢出问题,求教大神!

如何定位和解决Android的内存溢出问题(大总

内存溢出

Java内存问题——内存溢出