`

OOM和JVM优化(一)

阅读更多


OOM这个缩写就是Java程序开发过程中让人最头痛的问题:Out of Memory。在很多开发人员的开发过程中,或多或少的都会遇到这类问题,这类问题定位比较困难,往往需要根据经验来判断可能出现问题的代码。原因主要是两个:对象没有被释放(多种情况引起,往往是比较隐蔽的引用导致被Hold而无法被回收)。另一种就是真的Memory不够用了,需要增加JVM的Heap来满足应用程序的需求。最近有同事发的关于解决OOM的问题,让我了解了原来OOM除了在JVM Heap不够时会发生,在Native Heap不够的时候也会发生,同时JVM Heap和Native Heap存在着相互影响和平衡的关系,因此就仔细的去看了关于OOM和JVM配置优化的内容。

OOM
       在其他语言类似于C,Delphi等等由于内存都是由自己分配和管理,因此内存泄露的问题比较常见,同时也是很头痛的一件事情。而Java的对象生命周期管理都是JVM来做的,简化了开发人员的非业务逻辑的处理,但是这种自动管理回收机制也是基于一些规则的,而违背了这些规则的时候,就会造成所谓的“Memory Leak”。

OOM(Java Heap)
       错误提示:java.lang.OutOfMemoryError。
这类OOM是由于JVM分配的给应用的Heap Memory已经被耗尽,可能是因为应用在高负荷的情况下的却需要很大的内存,因此可以通过修改JVM参数来增加Java Heap Memory(不过也不能无限制增加,后面那种OOM有可能就是因为这个原因而产生)。另一种情况是因为应用程序使用对象或者资源没有释放,导致内存消耗持续增加,最后出现OOM,这类问题引起的原因往往是应用已不需要的对象还被其他有效对象所引用,那么就无法释放,可能是业务代码逻辑造成的(异常处理不够例如IO等资源),也可能是对于第三方开源项目中资源释放了解不够导致使用以后资源没有释放(例如JDBC的ResultSet等)。
       几个容易出现问题的场景:
       1.应用的缓存或者Collection:如果应用要缓存Java对象或者是在一个Collection中保存对象,那么就要确定是否会有大量的对象存入,要做保护,以防止在大数据量下大量内存被消耗,同时要保证Cache的大小不会无限制增加。
       2.生命周期较长的对象:尽量简短对象的生命周期,现在采用对象的创建释放代价已经很低,同时作了很好的优化,要比创建一个对象长期反复使用要好。如果能够设置超时的情景下,尽量设置超时。
       3.类似于JDBC的Connection Pool,在使用Pool中的对象以后需要释放并返回,不然就会造成Pool的不断增大,在其他Pool中使用也是一样。同样ResultSet,IO这类资源的释放都需要注意。

       解决的方法就是查找错误或者是增加Java Heap Memory。对于此类问题检测工具相当多,这里就不做介绍了。     


OOM(Native Heap)
错误提示:requested XXXX bytes for ChunkPool::allocate. Out of swap space。
       Native Heap Memory是JVM内部使用的Memory,这部分的Memory可以通过JDK提供的JNI的方式去访问,这部分Memory效率很高,但是管理需要自己去做,如果没有把握最好不要使用,以防出现内存泄露问题。JVM 使用Native Heap Memory用来优化代码载入(JTI代码生成),临时对象空间申请,以及JVM内部的一些操作。这次同事在压力测试中遇到的问题就是这类OOM,也就是这类Memory耗尽。同样这类OOM产生的问题也是分成正常使用耗尽和无释放资源耗尽两类。无释放资源耗尽很多时候不是程序员自身的原因,可能是引用的第三方包的缺陷,例如很多人遇到的Oracle 9 JDBC驱动在低版本中有内存泄露的问题。要确定这类问题,就需要去观察Native Heap Memory的增长和使用情况,在服务器应用起来以后,运行一段时间后JVM对于Native Heap Memory的使用会达到一个稳定的阶段,此时可以看看什么操作对于Native Heap Memory操作频繁,而且使得Native Heap Memory增长,对于Native Heap Memory的情况我还没有找到办法去检测,现在能够看到的就是为JVM启动时候增加-verbose:jni参数来观察对于Native Heap Memory的操作。另一种情况就是正常消耗Native Heap Memory,对于Native Heap Memory的使用主要取决于JVM代码生成,线程创建,用于优化的临时代码和对象产生。当正常耗尽Native Heap Memory时,那么就需要增加Native Heap Memory,此时就会和我们前面提到增加java Heap Memory的情况出现矛盾。

应用内存组合
       对于应用来说,可分配的内存受到OS的限制,不同的OS对进程所能访问虚拟内存地址区间直接影响对于应用内存的分配,32位的操作系统通常最大支持4G的内存寻址,而Linux一般为3G,Windows为2G。然而这些大小的内存并不会全部给JVM的Java Heap使用,它主要会分成三部分:Java Heap,Native Heap,载入资源和类库等所占用的内存。那么由此可见,Native Heap和 Java Heap大小配置是相互制约的,哪一部分分配多了都可能会影响到另外一部分的正常工作,因此如果通过命令行去配置,那么需要确切的了解应用使用情况,否则采用默认配置自动监测会更好的优化应用使用情况。
       同样要注意的就是进程的虚拟内存和机器的实际内存还是有区别的,对于机器来说实际内存以及硬盘提供的虚拟内存都是提供给机器上所有进程使用的,因此在设置JVM参数时,它的虚拟内存绝对不应该超过实际内存的大小。

分享到:
评论

相关推荐

    JVM优化与OOM分析PPT

    文档中描述java的JVM分析,及OOM问题实例讲解,分析。根据京东项目中的实例进行讲解

    深入JVM内核 - 原理、诊断与优化

    介绍常用的JVM诊断和分析工具,并以死锁和OOM为例,展示这些工具的使用。 第八课 分析Java堆 MAT的使用案例 Jvisualvm介绍使用 介绍了Java堆的分析方法,以一个实例为基础,展示对堆的分析过程。 第九课 锁 ...

    JVM的基础和调优【JMM 内存结构 GC OOM 性能调优 ThreadLocal】

    JVM的基础和调优【JMM 内存结构 GC OOM 性能调优 ThreadLocal】 内存泄露:是指程序在申请内存后,无法释放已申请的内存空间就造成了内存泄露, 一次的内存泄露似乎不会有大的影响,但是内存泄露堆积的后果就是内存...

    从 0 开始带你成为JVM实战高手

    有的朋友是一直开发那种几十个人使用的内部系统,所以没机会接触和经历。有的朋友是突然遇到线上IVM生产事故,毫无头绪。...全程专注于JVM生产实践,主要解决JVM生产环境的参数优化,JVM GO问题和IVM OOM问题的处理

    第四讲-JVM调优原理深度剖析、服务线上优化实践.pdf

    1.1 为什么进行 Jvm 调优? 原因非常简单: 1、垃圾太多,堆内存被占满了;程序跑不动了………. (性能下降) 2、堆内存被占满,发生频繁的垃圾回收(回收垃圾的线程太多:线程本身也会占用资 源,抢占 cpu 资源),和...

    【原价2300!!】尚硅谷_互联网大厂高频重点面试题视频详细讲解

    JUC多线程并发、JVM和GC等目前大厂笔试中会考、面试中会问、工作中会用的高频难点知识。...下半场,逐步过渡到JVM和GC的知识,深度讲解多种常见OOM异常和JVM参数调优,以及串行并行并发G1等各种垃圾收集器的优化实践。

    2019互联网面试题第2季.mmap

    尚硅谷周阳互联网大厂面试题(第2季) 脑图。包括JUC多线程并发、JVM和GC等目前大厂笔试中...下半场,逐步过渡到JVM和GC的知识,深度讲解多种常见OOM异常和JVM参数调优,以及串行并行并发G1等各种垃圾收集器的优化实践

    2019年互联网大厂高频重点面试题(第2季)

    本期内容包括JUC多线程并发、JVM和GC等目前大厂笔试中会考、面试中会问、工作中会用的高频...下半场,逐步过渡到JVM和GC的知识,深度讲解多种常见OOM异常和JVM参数调优,以及串行并行并发G1等各种垃圾收集器的优化实践

    MySQL OOM 系列一 Linux内存分配

    今天想提到的是线上一个4G的RDS实例,发生了OOM(out of memory)的问题,MySQL进程被直接Kill掉了。在解释这个问题的时候,我们首先需要从Linux系统内存分配策略讲起。  一般写C语言程序,我们习惯使用malloc动态...

    尚硅谷_互联网大厂高频重点面试题(第2季).xmind

    下半场,逐步过渡到JVM和GC的知识,深度讲解多种常见OOM异常和JVM参数调优,以及串行并行并发G1等各种垃圾收集器的优化实践。 无论是进入职场不久的初级程序员,还是技术长期没有成长、正在吃老本走下坡路但还想涨...

    虚拟机

    实际问题OOM内存不足问题GC问题(阅读GC日志) 配置/优化JVM参数目标内存管理和GC 字节码和类加载器JVM参数配置和优化CS核心基金会硬件网络操作系统DS /算法虚拟机类别物理硬件的系统VM(例如:Virtual Box,VMware...

    Android中的图片优化完全指南

    jvm每个进程都有内存上限,而native则没有限制(不是没有影响,至少不会oom),所以把内存大户Bitmap挪到native可能是很多人的梦想,但native的管理和实现明显比jvm更为复杂,除非有现成实现,很少有人去动这一块。...

    高级java笔试题-Android-Interview:收集知识点自学使用

    OOM、ANR及性能优化 各种机制 一些比较难理解的技术 启动流程 框架模式 开源库源码分析 其他 设计一套图片异步加载缓存方案 Android UI适配 第二部分 Java JavaSE JavaCollection JavaConcurrent JVM 第三部分 数据...

    WebLogic宕机大全总结

    本文主要是本人在实际的生产环境中遇到WebLogic宕机问题,经过自己的经验整理而总结的文档,对从事中间件的人将会是很好的参考。

    leetcode下载-studyday:记得我

    会有OOM风险...要么核心线程树可能过多要么 工作队列没有限制。 推荐使用ThreadPoolExecutor构造方法自己定制创建。设置适合的核心数,选择合适的阻塞队列类型以及大小。 线程池的工作原理 拒绝策略 Java Thread状态...

Global site tag (gtag.js) - Google Analytics