`

HotSpot VM - OutOfMemory Error 总汇

阅读更多

OutOfMemory Error表明Java 堆没有足够的内存去装载对象。垃圾回收器不能回收足够的空间去容纳一个新的对象,与此同时,堆空间也无法再进行扩展。

 

OutOfMemoryError抛出,栈会打印出信息。OutOfMemoryError也可能是在一个native的内存分配不能满足,由native库抛出,例如,交换空间比较小时,native 内存分配时就会抛出这种错误。

 

要查明OutOfMemoryError的原因,首先要知道这个错误发生的根本原因。是否是Java堆空间已经满了,或者是因为native堆空间已经满了。抛出这种异常有多种可能性,下面对常见的outOfmemory错误已经逐个解释:

 

1.Exception in thread "main": java.lang.OutOfMemoryError: Java heap space

 

抛出此类错误表明Java堆没有任何多余可用的内存。这类错误不一定似乎暗示内存泄露了。这种问题也可能是简单的配置问题-堆大小或者默认的堆大小设置过小,不能容纳应用程序所需要的内存。

 

在其它情况下,尤其是对长生命周期的应用程序而言,OutOfMemoryError也许意味着应用程序无意中持有了对改对象的引用,因此阻止了垃圾回收器的收集。这个就等同于Java语言的内存泄露。
注意应用程序调用的api也有可能无意中持有了对象的引用。

 

造成OutOfMemoryError错误,有一种可能的原因之一是滥用了finalizer。如果一个类有finalize方法,那该类型的对象在垃圾回收的时候,没有空间被回收。相反,垃圾回收以后,这个class的实例对象将会加入到finalization队列中。在Sun的实现中,finalizers是由一个守护线程执行并服务于finalization队列。如果finalizer线程不能跟上finalization队列,那么Java堆很可能爆满,从而导致OutOfMemoryError抛出。例如在这种场景下会出现这种情况:当一个应用程序创建了一个高优先级的线程,此线程finalization队列增长快速以至于finalizer线程服务于队列的速度难以跟上时,Java堆很快就会被耗尽。

 


 

2.Exception in thread "main": java.lang.OutOfMemoryError: PermGen space

PermGen space报错表明Java堆中的永久代空间已经满了。永久代区域存储了Class相关信息,方法区,常量池,方法相对应的字节码,还有final的变量。关于Perm Space中存储的具体信息,可以参照笔者前面写的blog。如果应用程序装载了大量的类,永久代的大小可能需要增加,在Hotspot VM中,可以通过设置参数-XX:MaxPermSize选项来进行设置。

 


Interned的字符串也是存储在永久代里面,String对象有intern方法,intern方法的作用是如果字符串池中有此字符串,则String.intern方法直接返回该字符串,如果字符串常量池中,没有该字符串那么将该字符串添加到池中。如果应用程序intern了大量的字符串,则永久代大小需要调整。

 

3.Exception in thread "main": java.lang.OutOfMemoryError: Requested array size exceeds VM limit

此类信息表明应用程序(或者被应用程序调用的APIs)试图分配一个大于堆大小的数组。例如,如果应用程序new 一个数组对象,大小为512M,但是最大堆大小为256M,因此OutOfMemoryError会抛出,因为数组的大小超过虚拟机的限制。在大多情况下,这种错误要不就是heap大小配置过小,要不就是程序的bug-在很少有情况下,需要申请这么大的数组。

 

4.Exception in thread "main": java.lang.OutOfMemoryError: request <size> bytes for <reason>. Out of swap space?

抛出这类错误,是由于从native堆中分配内存失败,并且堆内存可能接近耗尽。这类错误可能跟应用程序没有关系,例如下面两种原因也会导致错误的发生:
1)操作系统配置了较小的交换区
2)系统的另外一个进程正在消耗所有的内存

如果上面的两种原因都不是,也可能是native的内存泄露,例如,程序在不断分配内存,但是分配的内存没有还给操作系统。

 

5.Exception in thread "main": java.lang.OutOfMemoryError: <reason> <stack trace> (Native method)

  • 大小: 81.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics