`
jvtarena
  • 浏览: 16754 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

分享解决Java编程对OOM的场景

    博客分类:
  • java
阅读更多
在学习编程的过程中,我觉得不止要获得课本的知识,更多的是解决问题的方法,面对新问题该怎么解决,这样我们才能走在最前方,我是达内的学员,感谢你对本博客的支持;
  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:+CMSClassUnloadingEnabled3、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)设置的更合理。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文件。
知识就是力量,别人学用知识来赚钱的成本低,在达内学习到编程是铸造梦想的地方,如果你喜欢编程,这里,有我们共同语言,共同的故事,共同的梦想!
(责任编辑:广州达内http://www.jvtarena.com/)
分享到:
评论

相关推荐

    java poi 读取百万数据OOM优化

    在Java开发中,处理大量...通过使用EasyExcel或xlsx-Streamer,我们可以利用Java的流式处理技术,有效地控制内存使用,防止程序运行时出现OOM错误。在实际项目中,应根据业务需求和性能测试结果选择合适的工具和策略。

    安卓内存OOM分析

    在安卓系统中,"OOM"(Out of Memory)是指应用程序因为消耗了过多的内存而被系统强制终止,这是安卓开发者需要特别关注的问题。本篇将深入探讨安卓内存OOM的分析和解决策略,以及如何通过内核剖析来预防和处理此类...

    java poi 导入大数据量Excel数据 防止内存溢出处理.zip

    Java中的Apache POI库是用于读取和写入Microsoft Office格式文件,特别是Excel文档的流行工具。然而,当处理大数据量的Excel文件时,POI可能...在实践中,应根据具体场景选择合适的优化方法,确保程序的稳定性和性能。

    android图片墙lrucache oom

    当应用程序请求的内存超过系统分配的最大内存时,就会发生OOM。在Android中,每个应用都有自己的Dalvik虚拟机实例,其内存限制由Android系统决定。如果图片加载不当,尤其是在滚动列表时一次性加载过多图片,可能...

    Java多线程优化百万级数据

    在Java编程中,多线程是提升程序性能和并发处理能力的重要手段,特别是在处理大量数据时,如数据库的百万级数据读取。本篇将深入探讨如何利用Java多线程技术来优化这种高负载场景。 首先,理解Java多线程的基础至关...

    java并发编程.docx

    Java并发编程是Java开发中的重要领域,涉及到多线程、线程池以及线程局部变量等概念。在大型系统和高并发环境下,合理地利用这些技术可以极大地提高系统的性能和资源利用率。 一、线程池 线程池是Java并发编程中的...

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

    不过,解决这类问题通常需要结合具体的应用场景和日志信息进行调试,因此可能需要多次尝试和调整才能找到最佳解决方案。在实际操作中,记得备份当前的配置,并在测试环境中先进行调整,以避免对生产环境造成影响。

    OOM绝对不出现

    标题"OOM绝对不出现"表明这是一个关于如何避免Android应用程序内存溢出,特别是加载本地图片时的最佳实践。描述中提到“经过测试通过”,意味着已经找到了有效的方法来确保在加载图片时不会引发内存问题。 首先,...

    [OOM] 记一次线上OOM的问题 - ado19861

    在Java开发过程中,内存溢出(Out Of Memory,简称OOM)是常见的问题之一,它会导致应用程序崩溃或性能急剧下降。本文将详细探讨一个线上出现的OOM问题,以及如何通过日志分析、使用Eclipse的Memory Analyzer Tool...

    Java虚拟机规范中文版

    Java虚拟机(JVM)是Java编程语言的核心组成部分,它为Java程序提供了运行环境,使得Java代码能够在不同的操作系统上无缝运行,实现了“一次编写,到处运行”的理念。《Java虚拟机规范中文版》是对Java虚拟机全面...

    Android高效加载大图、多图解决方案,有效避免程序OOM.docx

    1. 使用低质量格式:对于不需要高质量图像的场景,可以考虑使用 WebP 或 JPEG 等压缩率更高的格式。 2. 缓存策略:合理设置内存和磁盘缓存策略,确保在有限的内存中存储尽可能多的常用图片。 3. 图片复用:利用缓存...

    java后端面试问题整理

    - 分析JVM内存溢出(OOM)问题的常见原因及解决办法。 5. **数据库相关** - 解释ACID事务的四个特性。 - 介绍索引的种类和它们对查询性能的影响。 - SQL优化技巧,如使用JOIN替代子查询,使用索引等。 - 解释...

    JAVA内存溢出详解.doc

    Java内存溢出(Out Of Memory,OOM)是Java应用程序运行时常见的问题,它通常发生在程序对内存需求超过了Java虚拟机(JVM)所能提供的可用内存时。本文将深入探讨Java内存溢出的原因、表现以及如何解决。 1. **Java...

    java内存溢出原因

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

    JVM优化与OOM分析PPT

    通过合理的配置JVM参数,可以显著提高应用程序的性能,解决诸如OOM等问题。本文档通过具体的案例分析,介绍了JVM的基本概念、工作原理以及调优技巧,希望能够帮助开发者更好地理解和掌握JVM调优的相关知识。

    OOMDemo,.zip

    在Java编程中,内存管理是开发者必须关注的重要一环。当程序运行时,如果分配给Java虚拟机(JVM)的内存不足,就会出现“OutOfMemoryError”(简称OOM),这是一种常见的运行时错误。本文将通过对名为"OOMDemo"的...

    java面试题集合java面试题集合java面试题集合

    5. **JVM内存模型**:了解堆、栈、方法区、本地方法栈、程序计数器的结构,理解内存溢出(OOM)的原因和解决办法,分析垃圾回收机制(GC)和垃圾收集器。 6. **异常处理**:异常分类(检查性异常和运行时异常),...

    java基础面试考察点.pdf

    Java 基础面试考察点 Java 基础面试考察点是 Java 开发人员必须掌握的知识点,...Java 基础面试考察点涵盖了 Java 基础知识、多线程、JVM 相关知识点等几个方面,对 Java 开发人员的知识面和编程能力提出了高要求。

    用于复现 OOM bug,模拟JVM调优经历-JVMTest.zip

    在Java开发过程中,内存管理是优化应用程序性能的关键环节。`OOM (Out of Memory)`错误是开发者经常遇到的问题,它表明程序在运行时耗尽了可用内存。为了理解和预防这类问题,我们需要深入理解JVM(Java虚拟机)的...

Global site tag (gtag.js) - Google Analytics