当前位置:编程学习 > JAVA >>

java for循环一百万次为什么报错了

                String tempstr = "abcdefghijklmnopqrstuvwxyz";
long l = System.currentTimeMillis();
StringBuffer sb = new StringBuffer();

for (int i = 0; i < 1000000; i++) {
sb.append(tempstr);
}
long L1 = System.currentTimeMillis();
System.out.println("StringBuffer"+(L1-l));
                这里是有一个限度?为什么?限度是多少? 谢谢各位大神了... --------------------编程问答-------------------- StringBuffer  字符大小不能超过int型的长度 --------------------编程问答-------------------- 异常:java.lang.OutOfMemoryError: Java heap space


每次增加是(str.length + 1) * 2长度

api中:java api

increasing the length of this sequence by the length of the argument

public static char[] copyOf(char[] original, int newLength) {
        char[] copy = new char[newLength];//最后到这报错了  newLength是上面每次增加的(str.length + 1) * 2    你的还是100W次
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }



引子百度知道:传送门

char[] chars = new char[2147483647];运行的时候会抛java.lang.OutOfMemoryError: Java heap space

所以最后的问题是出在char[] 数组最大的限制是多少、

--------------------编程问答-------------------- String类型是有长度限制的 --------------------编程问答-------------------- 看下面StingBuffer类的源码中的几个方法,从下面的几个方法可以看出StringBuffer
的长度是int的范围,一般情况下长度是2的32次方的长度, 
public StringBuffer(int capacity) {
super(capacity);
    }
 public synchronized void setLength(int newLength) {
super.setLength(newLength);
    }
   public synchronized char charAt(int index) {
if ((index < 0) || (index >= count))
    throw new StringIndexOutOfBoundsException(index);
return value[index];
    } --------------------编程问答-------------------- 这个不是长度限制的原因,是内存不够了
我电脑是64位的,1000000不会溢出,
我设置的6000000

public class Testttt{

public static void main(String args[]) {
 String tempstr = "abcdefghijklmnopqrstuvwxyz";
 long l = System.currentTimeMillis();
 StringBuffer sb = new StringBuffer();
 
for (int i = 0; i < 6000000; i++) {
sb.append(tempstr);
 }
 long L1 = System.currentTimeMillis();
 System.out.println("StringBuffer"+(L1-l));
}
}

运行:java -XX:+PrintGCDetails Testttt
可以得到:

OldGen几乎已经满了
可以用:
java -XX:+PrintGCDetails -Xmx1300m Testttt
就不会溢出,
但是如果你要打印,会在调用sb.toString()的时候产生溢出
可以自己算算大小,
我随便设置了下-Xmx4g可以成功打印出来 --------------------编程问答-------------------- 内存满了,2的32次方是很大的,区区一万个字符而已,何足挂齿,调整jvm的内存 --------------------编程问答-------------------- 长度没限制,知识内存溢出! --------------------编程问答-------------------- 除 --------------------编程问答-------------------- StringBuffer  字符大小不能超过int型的长度 --------------------编程问答-------------------- 内存溢出,明显的异常 --------------------编程问答-------------------- 内存溢出,可以修改你的Mysql的my.ini文件里的相关配置 --------------------编程问答-------------------- 单个线程,for循环n次,消耗的内存肯定很大。可以用多线程来平摊内存的消耗 --------------------编程问答-------------------- 内存没有那么大呀。不过,可以调整 --------------------编程问答-------------------- 看你是什么电脑,不然很容易就内存溢出了
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,