String str  = "hello world ";
int i=0;
while(true) {
   i++;
  System.out.println("=================:"+i);
  str = str+str;
}=================:16
=================:17
=================:18
=================:19
=================:20
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3209)
at java.lang.String.<init>(String.java:216)
at java.lang.StringBuilder.toString(StringBuilder.java:430)
at com.iss.util.Demo.main(Demo.java:12)

解决方案 »

  1.   

    String内部是以char数组的形式存储,数组的长度是int类型,那么String允许的最大长度就是Integer.MAX_VALUE了。又由于java中的字符是以16位存储的,因此大概需要4GB的内存才能存储最大长度的字符串。不过这仅仅是对字符串变量而言,如果是字符串字面量(string literals),如“abc"、"1a2b"之类写在代码中的字符串literals,那么允许的最大长度取决于字符串在常量池中的存储大小
    你这段程序我就能执行25次  
      

  2.   


    Integer.MAX_VALUE最大大概21亿,为何我对几千万长度的字符串进行操作:比如加上一个字符串。就会出现此错误?
      

  3.   

    每次相加等于加倍,20次等于 2的20次方大概等于 1M。 一个char是2个字节
    你的字符串长度是11.算下来才22M。
    刚才试了下jvm内存64M的时候 最多到20.调到1300M才勉强到25,看来String很占内存啊。
      

  4.   

    用stringbuffer试试效果,我记得这玩意是重新开辟一块内存把原来的两个都放进去吧,并不是直接在后边加
      

  5.   


    最后结果是 2 的 20 次方个“hello, world”,就是 1M个 hello, world
    每个 hello, world 是 12个字符,24个字节
    那么这个字符串会占用 24M 内存不知道JVM内部怎么做,但是估计在 jvm 内部会要求一片连续的内存用于存放字符串这么大的字符串,在现实中基本上不会使用到的,我一本750多页32开的书,字数约1000千字,差不多是1M了,楼主这个字符串,如果印刷成书,差不多是12本700页32开的书了。这么多内容,用一个字符串变量存储????