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
分享到:
相关推荐
技术文档分享。
HotspotShield-10.11.4-hss-805-ext
The Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide describes the garbage collection methods included in the Java HotSpot Virtual Machine (Java HotSpot VM) and ...
Troubleshooting Guide for Java SE 6 with HotSpot VM
深入解析hotspot实战!内容比较翔实、精辟,值得收藏!
Hotspot-2.0-Test-Plan,wifi联盟hotspot2.0认证资料,详细描述了认证测试需要的测试用例。
JDK12-hotspot-virtual-machine-garbage-collection-tuning-guide
JDK15-hotspot-virtual-machine-garbage-collection-tuning-guide
JDK11-hotspot-virtual-machine-garbage-collection-tuning-guide
JDK16-hotspot-virtual-machine-garbage-collection-tuning-guide
JDK17-hotspot-virtual-machine-garbage-collection-tuning-guide
JDK18-hotspot-virtual-machine-garbage-collection-tuning-guide
JDK19-hotspot-virtual-machine-garbage-collection-tuning-guide
JDK17社区封装版,也就是普通用户眼中的Java17,使用VSCode或Eclipse时会要求安装该文件,如果使用默认链接,会从GitHub下载安装,下载速度慢、连接不稳定。 社区版会较原版做一些优化,收社区人员维护并使用,还是...
jdk20-hotspot-virtual-machine-garbage-collection-tuning-guide Java Platform, Standard Edition HotSpot Virtual Machine Garbage Collection Tuning Guide-58
JDK11-jrockit-hotspot-migration-guide
JDK12-jrockit-hotspot-migration-guide
JDK13-jrockit-hotspot-migration-guide
OpenJDK11U-jdk-x64-windows-hotspot-11.0.16-8 JDK11
OpenJDK17U-jdk-x64-windows-hotspot-17.0.5-8,vscode配置java环境需要