1、OOM for Heap=>例如:java.lang.OutOfMemoryError: Java heap space
分 析: 此OOM是由于JVM中heap的最大值不满足需要,将设置heap的最大值调高即可,参数样例为:-Xmx2G
解决方法:调高heap的最大值,即-Xmx的值调大。
2、OOM for Perm=>例如:java.lang.OutOfMemoryError: Java perm space
分 析:此OOM是由于JVM中perm的最大值不满足需要,将设置perm的最大值调高即可,参数样例为:-XX:MaxPermSize=512M
解决方法:调高heap的最大值,即-XX:MaxPermSize的值调大。
另外,注意一点,Perm一般是在JVM启动时加载类进来,如果是JVM运行较长一段时间而不是刚启动后溢出的话,很有可能是由于运行时有类被动态加载进来,
此时建议用CMS策略中的类卸载配置。
如:-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled
3、OOM for GC=>例如:java.lang.OutOfMemoryError: GC overhead limit exceeded
分 析:此OOM是由于JVM在GC时,对象过多,导致内存溢出,建议调整GC的策略,在一定比例下开始GC而不要使用默认的策略,
或者将新代和老代设置合适的大小,需要进行微调存活率。
解决方法:改变GC策略,在老代80%时就是开始GC,并且将-XX:SurvivorRatio(-XX:SurvivorRatio=8)和-XX:NewRatio(-XX:NewRatio=4)设置的更合理。
第二种分析:
这个是JDK6新添的错误类型。是发生在GC占用大量时间为释放很小空间的时候发生的,是一种保护机制。
解决方案是,关闭该功能,使用—— -XX:-UseGCOverheadLimit
这里要查看是否有使用大内存的代码或死循环。
Sun官方解释:
The parallel / concurrent collector will throw an OutOfMemoryError if too much time is being spent in garbage collection: if more than 98% of the total time is spent in garbage collection and less than 2% of the heap is recovered, an OutOfMemoryError will be thrown. This feature is designed to prevent applications from running for an extended period of time while making little or no progress because the heap is too small. If necessary, this feature can be disabled by adding the option -XX:-UseGCOverheadLimit to the command line
异常如下:
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
解释:
JDK6新增错误类型。当GC为释放很小空间占用大量时间时抛出。
一般是因为堆太小。导致异常的原因:没有足够的内存。
解决方案:
(1)查看系统是否有使用大内存的代码或死循环。
(2)可以添加JVM的启动参数来限制使用内存:-XX:-UseGCOverheadLimit
4、OOM for native thread created=> 如:java.lang.OutOfMemoryError: unable to create new native thread
分 析
参考如下:
(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
MaxProcessMemory 指的是一个进程的最大内存
JVMMemory JVM内存
ReservedOsMemory 保留的操作系统内存
ThreadStackSize 线程栈的大小
如果JVM内存调的过大或者可利用率小于20%,可以建议将heap及perm的最大值下调,并将线程栈调小,即-Xss调小,如:-Xss128k
解决方法:在JVM内存不能调小的前提下,将-Xss设置较小,如:-Xss:128k
5、OOM for allocate huge array=>例如:Exception in thread "main": java.lang.OutOfMemoryError: Requested array size exceeds VM limit
分 析:
此类信息表明应用程序(或者被应用程序调用的APIs)试图分配一个大于堆大小的数组。例如,如果应用程序new一个数组对象,大小为512M,但是最大堆大小为256M,因此OutOfMemoryError会抛出,因为数组的大小超过虚拟机的限制。
解决方法
(1)、首先检查heap的-Xmx是不是设置的过小
(2)、如果heap的-Xmx已经足够大,那么请检查应用程序是不是存在bug,例如:应用程序可能在计算数组的大小时,存在算法错误,导致数组的size很大,从而导致巨大的数组被分配。
6、 OOM for small swap=>例如:Exception in thread "main": java.lang.OutOfMemoryError: request <size> bytes for <reason>. Out of swap space?
分 析
抛出这类错误,是由于从native堆中分配内存失败,并且堆内存可能接近耗尽。这类错误可能跟应用程序没有关系,例如下面两种原因也会导致错误的发生:
(1)操作系统配置了较小的交换区
(2)系统的另外一个进程正在消耗所有的内存
解决方法
(1)、检查os的swap是不是没有设置或者设置的过小
(2)、检查是否有其他进程在消耗大量的内存,从而导致当前的JVM内存不够分配。
注意:虽然有时<reason>部分显示导致OOM的原因,但大多数情况下,<reason>显示的是提示分配失败的源模块的名称,所以有必要查看日志文件,如crash时的hs文件。
分享到:
相关推荐
### Java.lang.OutOfMemoryError: PermGen space 及其解决方法 #### 一、PermGen space 概述 在Java虚拟机(JVM)中,PermGen space(永久代)是用于存储类的信息、常量、静态变量等数据的区域。在Java 8之前,Perm...
5. **增大PermGen或Metaspace大小**:如果你看到 `OutOfMemoryError: PermGen space` 或 `Metaspace`,这是方法区溢出,可以通过 `-XX:MaxPermSize` (对于老版本JVM) 或 `-XX:MaxMetaspaceSize` (对于Java 8及以后...
在Java开发过程中,我们经常会遇到`java.lang.OutOfMemoryError`(简称OOM)的问题。这个问题的发生主要是由于JVM内存不足或程序中存在内存泄漏所引起的。本文将深入探讨OOM产生的原因以及如何有效地解决这一问题。 ...
当程序创建新的对象并分配给堆时,如果堆空间不足,就会抛出`OutOfMemoryError: Java heap space`异常。Java应用程序可以通过设置JVM的启动参数来控制堆的大小,例如`-Xms`和`-Xmx`分别用于设置初始堆大小和最大堆...
通过以上方法,我们可以有效地解决Java heap space问题,确保Java应用程序稳定高效地运行。然而,值得注意的是,内存配置并非一劳永逸,应根据应用的实际运行情况和服务器资源动态调整,以达到最佳的性能平衡。
java.lang.OutOfMemoryError是Java开发者在工作中经常会遇到的一个内存错误。该错误通常发生在JVM无法为新对象分配足够的堆内存时。由于内存问题导致的程序崩溃给开发和维护带来了极大的挑战,而解决这类问题需要对...
OutOfMemoryError是Java程序在运行过程中,由于内存不足而抛出的一种异常。其根本原因在于程序运行时动态分配的内存超出了JVM设定的最大内存限制。解决OutOfMemoryError通常需要从内存管理、代码优化、数据结构选择...
在实际应用中,内存溢出问题的解决往往需要结合具体的应用场景和负载情况进行细致的调优。对于频繁进行类加载或使用大量第三方库的环境,增大PermGen空间可能更为关键;而对于那些需要处理大量对象实例的系统,合理...
OutOfMemoryError是Java虚拟机(JVM)在运行过程中,由于无法分配到足够的内存而抛出的一种常见的运行时异常。这种错误通常是由于内存资源耗尽导致的,常见的场景包括创建大量对象、使用超大数组、或者不恰当的内存...
Java内存溢出(Out Of Memory, OOM)是开发者在编程过程中经常遇到的问题,尤其是在处理大量数据或长时间运行的应用程序时。本篇文章将详细解析三种常见的Java内存溢出类型:JVM PermGen space溢出、JVM heap space...
《Java中的OutOfMemoryError:八种典型场景解析》 在Java编程中,`OutOfMemoryError`是开发者常常遇到的一种运行时异常,它通常意味着程序在尝试分配内存时遇到了问题,无法获取足够的空间来完成操作。这篇文章将...
Java中的String类提供了丰富的字符串操作...以上是Java中String类的一些常用方法,它们是进行字符串操作时的基础工具,每一个方法都根据不同的使用场景来实现相应的功能,从而满足在Java开发中对字符串的各种处理需求。
- "Java中的OutOfMemoryError和JVM内存结构.docx"可能详细介绍了内存溢出的常见原因及解决方案,以及JVM内存各区域的详细功能。 - "深入理解Java虚拟机JVM高级特性与最佳实践.pdf"可能会涵盖上述的JVM高级特性,...
解决内存泄漏的方法主要包括: 1. 使用弱引用或软引用,以便在需要时及时释放内存。 2. 注意避免循环引用,尤其是在使用集合类时。 3. 及时关闭不再使用的资源,如数据库连接、文件流等。 4. 使用内存分析工具,如...
该问题在Java应用开发中较为常见,尤其是在处理大量数据或图形界面等内存消耗较大的场景中。解决这类问题主要可以从调整JVM内存分配参数、优化代码减少内存消耗以及使用弱引用类型等方面入手。 首先,增加JVM内存...
Java内存模型中的三个代——年轻代、终身代与永久代,是理解Java虚拟机(JVM)内存管理机制的关键。在JDK1.4至JDK6版本中,Java的内存模型由这三大区域组成,各自承担着不同的角色,对垃圾回收(GC)策略有着直接影响。 ...
OutOfMemoryError 异常有多种场景,包括 java.lang.OutOfMemoryError: Java heap space、java.lang.OutOfMemoryError: GC overhead limit exceeded 和 java.lang.OutOfMemoryError: Direct buffer memory 等。
通过上述方法,开发者可以有效解决Java中的内存溢出问题。当然,在实际应用中还需要结合具体情况灵活运用这些技巧。此外,定期对代码进行审查和重构也是预防内存溢出的有效手段之一。希望本文能帮助到正在面对内存...