jvm内存问题和String到底有没有长度限制
2009-10-22 18:52
274 查看
jvm内存问题和String到底有没有长度限制
有人说:“不断的将被选中的字符串加到某一字符串末尾,当长度超过一定量是就提示:
java.lang.StringIndexOutOfBoundsException: String index out of range: 10
”说明String有长度限制。
看一下Java API就会知道
java.lang.StringIndexOutOfBoundsException出现的情况是
Thrown by String methods to indicate that an index is either negative or greater than the size of the string. For some methods such as the charAt method。
上面的错误是因为
String.length()<10;
而你又要取index>=10的字符,自然就会抛出上面的例外。
String其实是没有限制的,而是当String太大了,超过JVM的自身的内存后会抛出
java.lang.OutOfMemoryError错误
下面作个实验:
public class testString{
public static void main(String args[])
{
String s="abbbbb";
System.out.println("JVM MAX MEMORY: "+Runtime.getRuntime().maxMemory()/1024/1024+"M");
System.out.println("JVM IS USING MEMORY:"+Runtime.getRuntime().totalMemory()/1024/1024+"M");
Runtime.getRuntime().traceMethodCalls(true);
while(true)
{
try{
s=s+s;
}catch(Exception e)
{
System.out.println(e);
}
catch(Error o)
{ String unit = null;
int sizeb = s.length();
int size = sizeb;
int time = 0;
while(size>1024)
{
size = size/1024;
time++;
}
switch(time)
{
case 0: unit = "byte";break;
case 1: unit = "k"; break;
case 2: unit = "M"; break;
default : unit = "byte";
}
System.out.println("String has used memory:"+size+unit);
System.out.println("JVM IS USING MEMORY:"+(float)Runtime.getRuntime().totalMemory()/1024/1024+"M");
System.out.println("MemoryError:"+o);
break;
}
}
}
}
然后我们用JVM的默认参数执行(我的机器内存是128M)
java testString
结果:
JVM MAX MEMORY: 128M
JVM IS USING MEMORY:1M
String has used memory:12M
JVM IS USING MEMORY:63.5625M
MemoryError:java.lang.OutOfMemoryError
开始JVM使用的内存是1M,当String为12M,JVM使用了63M多时
JVM溢出。
然后,我们用限制JVM内存大小的参数来执行,限制最大内存5M
java -mx5m testString
结果:
JVM MAX MEMORY: 70M
JVM IS USING MEMORY:1M
String has used memory:768.0k
JVM IS USING MEMORY:5.9375M
MemoryError:java.lang.OutOfMemoryError
开始JVM使用的内存是1M,当String为768k,JVM使用了5M多时
JVM溢出。
大家还可以改变 -mx参数,来进一步做实验。
以上两个实验证明,String是没有长度限制的,而是有JVM的内存限制了String的长度。同时说明,并不会抛出任何Exception而只会抛出Error.
OutMemoryError表明程序的设计很差,或者遇到了超出编程人员所预想的大批量的数据。不管哪种情况,都只有下面这几种解决办法。它们是:
设计人员重新设计程序,不致使程序一次载入所有的数据。
数据可以分割成更小的块。
可以为程序分配更多的内存。
为Java虚拟机提供更多的内存。
而上面的例子是为虚拟机提供更多的内存
相关文章推荐
- JVM 对于STRING 产生的常量和 常量到底有没有在堆中 有内存分配 的说明
- 素数距离问题 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度。如果左右有等距离长度素数
- 关于jvm的内存限制的问题的解决办法
- JVM内存限制问题解决方案
- 关于jvm的内存限制的问题的解决办法
- JVM内存限制问题解决方案
- 关于WP7中的90M内存限制问题及设计原则
- 老问题 IT 行业加班到底有没有价值?
- 增加00-调整JVM内存大小 +++解决MyEclipse编写JSP时候光标来回来跳的问题
- Java问题解析:到底创建了几个String对象?
- jvm住内存与工作内存,内存模型反映的java多线程问题
- 【解决】Spark On Yarn执行中executor内存限制问题
- 中文长度限制,GCD,相机截取等开发问题
- 关于 JVM 内存的 N 个问题(转)
- tomcat 的jvm 内存溢出问题的解决及JVM性能调优
- JVM_Java之内存分析和String对象
- JVM系列:解决JVM最大内存设置问题
- 江湖问题研究-- intent传递有没有大小限制,是多少?
- java加解密-密钥长度限制问题
- Linux系统中JVM内存2GB的限制