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
分享到:
相关推荐
Compilation in the HotSpot VM Compilation in the HotSpot VM 是一篇关于 Java 虚拟机(Java Virtual Machine,JVM)的技术文档, 由 Oracle 公司的 HotSpot 编译器团队的 Zoltán Majó 撰写。该文档详细介绍了...
HotspotShield-10.11.4-hss-805-ext
### Java SE 6与HotSpot VM故障排除指南关键知识点解析 #### 一、概述 《Java SE 6与HotSpot VM故障排除指南》是Oracle公司于2008年11月发布的一份技术文档,旨在帮助开发人员、系统管理员和技术支持人员解决在...
深入解析hotspot实战!内容比较翔实、精辟,值得收藏!
HotSpot VM是Oracle JDK中默认的JVM实现,它提供了一种称为HSDB(HotSpot Debugger Bridge)的工具,用于在运行时查看和分析JVM内部的数据。本篇将通过HSDB的使用案例来探讨HotSpot VM的运行时数据。 首先,我们...
JDK17社区封装版,也就是普通用户眼中的Java17,使用VSCode或Eclipse时会要求安装该文件,如果使用默认链接,会从GitHub下载安装,下载速度慢、连接不稳定。 社区版会较原版做一些优化,收社区人员维护并使用,还是...
OpenJDK17U-jdk-x64-windows-hotspot-17.0.5-8,vscode配置java环境需要
Hotspot VM的名字来源于其核心理念——热点代码检测,即自动识别并优化执行频繁的代码段,从而提高整体程序的运行效率。本文将围绕Hotspot VM的源码进行深入探讨,揭示其内部工作机制。 一、Hotspot VM的架构 ...
Hotspot 2.0 认证测试计划 Hotspot 2.0 是 Wi-Fi 联盟制定的一个认证计划,旨在确保 Wi-Fi 设备能够提供更好的用户体验。Hotspot 2.0 认证计划涵盖了多个方面,包括网络发现、身份验证、安全认证、网络连接等。 ...
"Dissecting the Hotspot JVM" 本文档是关于 Java 虚拟机(JVM)的深入分析,作者 Martin Toshev 通过分享 JVM 的架构、实现机理和调试技术,帮助读者更好地理解 JVM,并为其提供了实践经验。 虚拟机基础 虚拟机...
《Java平台标准版HotSpot虚拟机垃圾收集调优指南》是针对Java HotSpot虚拟机(Java HotSpot VM)内建的垃圾收集算法的一份详细指南,旨在帮助开发者和系统管理员选择最适合他们应用需求的垃圾收集策略。这份文档适用...
OpenJDK11U-jdk-x64-windows-hotspot-11.0.16-8 JDK11
OpenJDK17U-jdk_x64_windows_hotspot_17.0.1_12.msi
JDK 18 HotSpot 虚拟机垃圾回收优化指南 Java 平台标准版 HotSpot 虚拟机垃圾回收调整指南是 Oracle 公司出版的一本官方指南,旨在帮助开发者和系统管理员优化 Java 应用程序的垃圾回收性能。该指南涵盖了 HotSpot ...
《Java平台标准版HotSpot虚拟机垃圾收集调优指南》是Oracle公司为Java开发者和系统管理员提供的一份重要文档,适用于JDK 20版本。本文档主要关注HotSpot虚拟机的垃圾收集(Garbage Collection, GC)机制的优化,以...
【Java HotSpot VM Serial GC详解】 HotSpot VM的Serial GC是一种单线程的垃圾收集器,主要用于新生代的垃圾回收,特别适用于轻量级和低内存的环境。在这个话题中,我们将深入探讨Serial GC在新生代(Young ...
JDK16-HotSpot虚拟机垃圾回收调整指南 Java平台的HotSpot虚拟机垃圾回收调整指南是Java开发人员和系统管理员不可或缺的参考手册。该指南详细介绍了HotSpot虚拟机的垃圾回收机制,包括垃圾回收算法、垃圾回收器的...