zoukankan      html  css  js  c++  java
  • 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);
         *     }
         */
    }
    
  • 相关阅读:
    【转】千万级并发实现的秘密:内核不是解决方案,而是问题所在!
    漫话NUMA
    【转】为什么要内存对齐 Data alignment: Straighten up and fly right
    【转】内存地址对齐运算
    DPDK收发包处理流程-----(一)网卡初始化
    Nginx WebSocket proxying example
    nginx example
    kerberos-ldap linux账户集中管理认证
    利用i节点删除乱码文件
    linux sar命令详解
  • 原文地址:https://www.cnblogs.com/fly-book/p/11332171.html
Copyright © 2011-2022 走看看