(三)OutOfMemoryError异常

来源:互联网 发布:电视免费视频软件 编辑:程序博客网 时间:2024/06/18 16:32

           除了程序计数器外,虚拟机内存的其他几个运行时区域都会发生OutOfMemoryError,在虚拟机栈和本地方法栈中,会多出现一种异常:Stack Overflow,意思是请求深度超过了允许!

   (1)Java堆溢出:Java堆用于存储对象实例,只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来避免GC回收这些对象,那么当对象数量超过的时候,就是异常的时候!

Vm Args:  -Xms20m -Xmx20m  -XX:+HeapDumpOnOutOfMemoryError   即:堆的最小内存是20兆,堆得最大内存是20兆,同时让虚拟机在出现溢出异常时候Dump出当前的内存堆转储快照以便事后分析。

       要解决这个区域的异常:一般的手段是先通过内存映像分析工具(Eclipse Memory Analyzer)对Dump出来的堆转储快照进行分析,主要是分析:1,出现了内存泄漏 (GC未回收,或者对象代码创建方式不正确的,比如循环无用的对象)2,内存不足(对象都是需要使用的,内存不够)    其中的哪个原因!如果不是内存泄漏,那么就应该检查是否存在某些对象的生命周期过长,持有状态时间过长,尝试减少程序运行的内存消耗,如果不行,那就升级硬件,加大堆得内存!


(2)虚拟机栈和本地方法栈溢出: 在HotSpot中,不区分二者! -Xoss(设置本地方法栈大小)存在,但实际上是无效 的,栈容量只由 -Xss参数设置!

  1,如果线程请求的栈深度大于虚拟机所允许的最大深度,那么将抛出 StackOverflowError 

  2,如果虚拟机在扩展栈内存的时候,无法申请到足够的内存空间,则抛出OutOfMemoryError(先检查虚拟机的栈内存是否设置)


(3)方法区和运行时常量池溢出

 String.intern()是一个Native方法,作用是:如果字符串常量池中已经保存一个等于此String对象的字符串,则返回代表池中这个字符串的String对象;否则,将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用!

(4)本机直接内存溢出

  通过-XX:MaxDirectMemorySize指定,如果不指定,那么默认与Java堆得最大值一样!可以尝试查找一下NIO的原因