`
sooxin
  • 浏览: 257578 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

jvm内存问题和String到底有没有长度限制

    博客分类:
  • J2EE
阅读更多
有人说:
“不断的将被选中的字符串加到某一字符串末尾,当长度超过一定量是就提示:
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虚拟机提供更多的内存。

而上面的例子是为虚拟机提供更多的内存

分享到:
评论
1 楼 gepangtsai 2009-11-13  
有道理,领教

相关推荐

    测试JVM字符串长度的testcase

    用于测试Java字符串长度的testcase,-jar文件,可以通过设置JVM的内存设置 VM argument(eclipse中方便设置)来考察java string可以接受的长度 总体评价来看,java字符串可以任意长,除非字长超出JVM的内存限制,...

    String 优化

    本文主要探讨了Java `String`在JVM中的存储结构以及如何优化String操作以减少内存消耗。 首先,了解Java对象在JVM中的存储结构至关重要。每个Java对象都包含对象头、原始类型数据、引用和可能的填充符。对象头通常...

    第5讲 String、StringBuffer、StringBuilder有什么区别1

    在Java中,我们有三种主要的字符串类:String、StringBuffer和StringBuilder,它们各自具有不同的特性和适用场景。 首先,`String`类是Java中的一个基础且不可变的类,被声明为`final`,其内部属性也是`final`的。...

    经典C#面试题集锦.doc

    答案是:string str = null 不分配内存空间,而 string str = "" 给它分配长度为空字符串的内存空间。 二、类和结构:在C#中,类(class)和结构(struct)有什么异同?答案是:Class 可以被实例化,属于引用类型,...

    阿里巴巴电话面试整理

    但在Java中,由于垃圾回收机制的存在,内存溢出更多地体现在堆空间不足,而在C++中则可能涉及堆和栈的内存管理问题。 5. **ClassLoader的功能和工作模式**: 类加载器负责加载类到JVM中。它遵循双亲委托模型,即先...

    java笔试题

    - Java的垃圾收集器有助于保持系统的稳定性和避免手动内存管理的问题。 13. **ClassLoader的类加载**: - JVM中有多个类加载器,每个负责加载特定位置的类。Bootstrap类加载器负责加载JVM的基础库,如rt.jar中的...

    java面试宝典

    String 有没有length()这个方法? 9 16、在JAVA 中,如何跳出当前的多重嵌套循环? 9 17、构造器Constructor 是否可被override? 9 18、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对...

    Java基础面试题.pdf

    String有length()方法,返回字符串长度。 14. **重载与覆盖**:重载(Overload)是同一个类中方法名相同但参数列表不同的方法,返回值类型可以不同。覆盖(Override)发生在继承关系中,子类重写父类的方法,要求...

    AppScan Source测试ExploitMe Mobile Android Labs项目.docx

    如果输入流中没有这些终止符,readLine()会不断读取并扩大输入缓冲区,直至耗尽所有堆内存,导致`OutOfMemoryException`,进而使Java虚拟机(JVM)和应用程序崩溃,形成拒绝服务(Denial of Service, DoS)攻击。...

    从C++到Java的成功之路

    C++是一种静态类型的、编译式的语言,它强调底层控制和效率,允许程序员操作内存,而Java则是一种动态类型的、解释执行的语言,它通过Java虚拟机(JVM)运行,提供了跨平台的便利性。Java的设计目标是简化编程,因此...

    java经典问题答案

    ##### String创建对象的内存问题 - 当使用字面量创建字符串时,JVM会检查常量池中是否存在相同值的字符串,如果存在则直接返回引用;否则在常量池中创建并返回引用。使用`new`关键字创建字符串对象时,会在堆中创建...

    Java面试试题集锦

    - Error:系统级错误,通常由系统或者JVM自身问题引起,无法恢复。 - Exception:程序运行过程中出现的异常情况,可以捕获并处理。 19. **List, Set, Map与Collection的关系**: - List、Set继承自Collection...

    20练习1

    `length()`、`split()`、`equals()`、`contains()`、`toUpperCase()`、`toLowerCase()`、`replace()`和`replaceAll()`是String类的一些常用方法,它们分别用于获取字符串长度、分割字符串、比较相等性、查找子串、...

    Java面试八股文十万字总结.docx

    有没有可能两个不相等的对象有相同的hashcode** 有可能,哈希冲突会导致这种情况,但合理的哈希码实现应该尽量降低冲突的概率。 **18. 深拷贝和浅拷贝的区别** - **浅拷贝**:只复制对象本身,不复制引用的对象...

Global site tag (gtag.js) - Google Analytics