`
lelong
  • 浏览: 553919 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Java中关于OutOfMemoryError的场景及解决方法

 
阅读更多

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及其解决方法

    ### Java.lang.OutOfMemoryError: PermGen space 及其解决方法 #### 一、PermGen space 概述 在Java虚拟机(JVM)中,PermGen space(永久代)是用于存储类的信息、常量、静态变量等数据的区域。在Java 8之前,Perm...

    kettle内存溢出(Java heap space)以及解决方法.docx

    当程序创建新的对象并分配给堆时,如果堆空间不足,就会抛出`OutOfMemoryError: Java heap space`异常。Java应用程序可以通过设置JVM的启动参数来控制堆的大小,例如`-Xms`和`-Xmx`分别用于设置初始堆大小和最大堆...

    Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException)

    5. **增大PermGen或Metaspace大小**:如果你看到 `OutOfMemoryError: PermGen space` 或 `Metaspace`,这是方法区溢出,可以通过 `-XX:MaxPermSize` (对于老版本JVM) 或 `-XX:MaxMetaspaceSize` (对于Java 8及以后...

    解决OutOfMemoryError内存溢出

    在Java开发过程中,我们经常会遇到`java.lang.OutOfMemoryError`(简称OOM)的问题。这个问题的发生主要是由于JVM内存不足或程序中存在内存泄漏所引起的。本文将深入探讨OOM产生的原因以及如何有效地解决这一问题。 ...

    解决Java_heap_space问题

    通过以上方法,我们可以有效地解决Java heap space问题,确保Java应用程序稳定高效地运行。然而,值得注意的是,内存配置并非一劳永逸,应根据应用的实际运行情况和服务器资源动态调整,以达到最佳的性能平衡。

    OutOfMemoryError_8种典型案例分享

    java.lang.OutOfMemoryError是Java开发者在工作中经常会遇到的一个内存错误。该错误通常发生在JVM无法为新对象分配足够的堆内存时。由于内存问题导致的程序崩溃给开发和维护带来了极大的挑战,而解决这类问题需要对...

    Tomcat给我的java.lang.OutOfMemoryError: PermGen

    在实际应用中,内存溢出问题的解决往往需要结合具体的应用场景和负载情况进行细致的调优。对于频繁进行类加载或使用大量第三方库的环境,增大PermGen空间可能更为关键;而对于那些需要处理大量对象实例的系统,合理...

    java内存溢出原因

    Java内存溢出(Out Of Memory, OOM)是开发者在编程过程中经常遇到的问题,尤其是在处理大量数据或长时间运行的应用程序时。本篇文章将详细解析三种常见的Java内存溢出类型:JVM PermGen space溢出、JVM heap space...

    OutOfMemoryError-8种典型案例分享.rar

    《Java中的OutOfMemoryError:八种典型场景解析》 在Java编程中,`OutOfMemoryError`是开发者常常遇到的一种运行时异常,它通常意味着程序在尝试分配内存时遇到了问题,无法获取足够的空间来完成操作。这篇文章将...

    Java 中 String 类的常用方法

    Java中的String类提供了丰富的字符串操作...以上是Java中String类的一些常用方法,它们是进行字符串操作时的基础工具,每一个方法都根据不同的使用场景来实现相应的功能,从而满足在Java开发中对字符串的各种处理需求。

    Java虚拟机资料(5个文件)

    - "Java中的OutOfMemoryError和JVM内存结构.docx"可能详细介绍了内存溢出的常见原因及解决方案,以及JVM内存各区域的详细功能。 - "深入理解Java虚拟机JVM高级特性与最佳实践.pdf"可能会涵盖上述的JVM高级特性,...

    java内存管理问题及解决办法

    解决内存泄漏的方法主要包括: 1. 使用弱引用或软引用,以便在需要时及时释放内存。 2. 注意避免循环引用,尤其是在使用集合类时。 3. 及时关闭不再使用的资源,如数据库连接、文件流等。 4. 使用内存分析工具,如...

    Java内存模型中的三个代

    Java内存模型中的三个代——年轻代、终身代与永久代,是理解Java虚拟机(JVM)内存管理机制的关键。在JDK1.4至JDK6版本中,Java的内存模型由这三大区域组成,各自承担着不同的角色,对垃圾回收(GC)策略有着直接影响。 ...

    无私奉献-jvm面试备战

    OutOfMemoryError 异常有多种场景,包括 java.lang.OutOfMemoryError: Java heap space、java.lang.OutOfMemoryError: GC overhead limit exceeded 和 java.lang.OutOfMemoryError: Direct buffer memory 等。

    内存溢出解决

    通过上述方法,开发者可以有效解决Java中的内存溢出问题。当然,在实际应用中还需要结合具体情况灵活运用这些技巧。此外,定期对代码进行审查和重构也是预防内存溢出的有效手段之一。希望本文能帮助到正在面对内存...

    OutOfMemoryError_8种典型案例分享.pdf

    在本篇文档中,将详细介绍java.lang.OutOfMemoryError的8种典型案例,并讨论它们的成因和解决方法。这些案例包括Java堆内存溢出、永久代空间溢出、元空间溢出、无法创建新的本地线程、交换空间不足、请求的数组大小...

    Java虚拟机内存区域模型

    直接内存可以在一些场景中显著提高性能,因为其避免了在Java堆和Native堆中来回复制数据。 Java虚拟机内存区域模型是Java开发中最重要的内容之一,了解Java虚拟机内存区域模型,可以帮助开发者更好地编写高效、可靠...

    Java 常见问题解决集合.docx

    ### Java常见问题及解决方案 #### 一、编译错误 **1.1 问题:** "cannot find ...这些只是Java开发者在日常工作中可能遇到的部分问题及解决方法。针对不同的项目场景,具体的解决方案可能还需要根据实际情况灵活调整。

    java多线程导出excel(千万级别)优化

    Java多线程导出Excel是处理大数据量时的一种高效策略,尤其在面对千万...通过这种多线程和分批处理的方法,可以在不牺牲性能的前提下,安全地处理千万级别的数据导出,使得这种解决方案在生产环境中变得可行且稳定。

    从 Java 代码到 Java 堆 理解和优化您的应用程序的内存使用

    优化算法或减少局部变量的使用是解决方法之一。 总的来说,理解Java内存使用并进行优化不仅涉及Java代码的编写,还包括对JVM和操作系统内存管理的深刻理解。通过细致的分析和实践,开发者可以创建出更高效、更健壮...

Global site tag (gtag.js) - Google Analytics