JVM OOM如何java oom排查思路?

本文源自转载:JVM出现OOM的八种原因及解决办法目录一、堆溢出1.1 原因1.2解决方法二、永久代/元空间溢出2.1 原因2.2 解决方法三、GC overhead limit exceeded3.1 原因3.2 解决方法四、方法栈溢出4.1 原因4.2 解决方法五、非常规溢出5.1 分配超大数组5.2 swap溢出5.3 解决方案六、本地方法溢出一、堆溢出这种场景最为常见,报错信息:java.lang.OutOfMemoryError: Java heap space复制代码
1.1 原因1、代码中可能存在大对象分配2、可能存在内存泄露,导致在多次GC之后,还是无法找到一块足够大的内存容纳当前对象。1.2解决方法1、检查是否存在大对象的分配,最有可能的是大数组分配2、通过jmap命令,把堆内存dump下来,使用mat工具分析一下,检查是否存在内存泄露的问题3、如果没有找到明显的内存泄露,使用 -Xmx 加大堆内存4、还有一点容易被忽略,检查是否有大量的自定义的 Finalizable 对象,也有可能是框架内部提供的,考虑其存在的必要性二、永久代/元空间溢出报错信息:java.lang.OutOfMemoryError: PermGen spacejava.lang.OutOfMemoryError: Metaspace复制代码
2.1 原因永久代是 HotSot 虚拟机对方法区的具体实现,存放了被虚拟机加载的类信息、常量、静态变量、JIT编译后的代码等。JDK8后,元空间替换了永久代,元空间使用的是本地内存,还有其它细节变化:字符串常量由永久代转移到堆中和永久代相关的JVM参数已移除可能原因有如下几种:1、在Java7之前,频繁的错误使用String.intern()方法2、运行期间生成了大量的代理类,导致方法区被撑爆,无法卸载3、应用长时间运行,没有重启没有重启 JVM 进程一般发生在调试时,如下面 tomcat 官网的一个 FAQ:
Why does the memory usage increase when I redeploy a web application
That is because your web application has a memory leak.
A common issue are “PermGen” memory leaks. They happen because the Classloader (and the Class objects it loaded) cannot be recycled unless some requirements are met (). They are stored in the permanent heap generation by the JVM, and when you redeploy a new class loader is created, which loads another copy of all these classes. This can cause OufOfMemoryErrors eventually.
(*) The requirement is that all classes loaded by this classloader should be able to be gc’ed at the same time.
2.2 解决方法因为该OOM原因比较简单,解决方法有如下几种:1、检查是否永久代空间或者元空间设置的过小2、检查代码中是否存在大量的反射操作3、dump之后通过mat检查是否存在大量由于反射生成的代理类4、放大招,重启JVM三、GC overhead limit exceeded这个异常比较的罕见,报错信息:java.lang.OutOfMemoryError:GC overhead limit exceeded复制代码
3.1 原因这个是JDK6新加的错误类型,一般都是堆太小导致的。Sun 官方对此的定义:超过98%的时间用来做GC并且回收了不到2%的堆内存时会抛出此异常。3.2 解决方法1、检查项目中是否有大量的死循环或有使用大内存的代码,优化代码。2、添加参数 -XX:-UseGCOverheadLimit 禁用这个检查,其实这个参数解决不了内存问题,只是把错误的信息延后,最终出现 java.lang.OutOfMemoryError: Java heap space。3、dump内存,检查是否存在内存泄露,如果没有,加大内存。四、方法栈溢出报错信息:java.lang.OutOfMemoryError : unable to create new native Thread复制代码
4.1 原因出现这种异常,基本上都是创建的了大量的线程导致的,以前碰到过一次,通过jstack出来一共8000多个线程。4.2 解决方法1、通过 -Xss 降低的每个线程栈大小的容量2、线程总数也受到系统空闲内存和操作系统的限制,检查是否该系统下有此限制:/proc/sys/kernel/pid_max/proc/sys/kernel/thread-maxmaxuserprocess(ulimit -u)/proc/sys/vm/maxmapcount五、非常规溢出下面这些OOM异常,可能大部分的同学都没有碰到过,但还是需要了解一下5.1 分配超大数组报错信息 :java.lang.OutOfMemoryError: Requested array size exceeds VM limit复制代码
这种情况一般是由于不合理的数组分配请求导致的,在为数组分配内存之前,JVM 会执行一项检查。要分配的数组在该平台是否可以寻址(addressable),如果不能寻址(addressable)就会抛出这个错误。解决方法就是检查你的代码中是否有创建超大数组的地方。5.2 swap溢出报错信息 :java.lang.OutOfMemoryError: Out of swap space复制代码
这种情况一般是操作系统导致的,可能的原因有:1、swap 分区大小分配不足;2、其他进程消耗了所有的内存。5.3 解决方案1、其它服务进程可以选择性的拆分出去2、加大swap分区大小,或者加大机器内存大小六、本地方法溢出报错信息 :java.lang.OutOfMemoryError: stack_trace_with_native_method复制代码
本地方法在运行时出现了内存分配失败,和之前的方法栈溢出不同,方法栈溢出发生在 JVM 代码层面,而本地方法溢出发生在JNI代码或本地方法处。这个异常出现的概率极低,只能通过操作系统本地工具进行诊断,难度有点大,还是放弃为妙。

博主最近登录服务器发现某个项目发生了OOM,也就是“Out Of Memory”,翻译成中文就是“内存用完了”,也称为内存溢出。
绪论内存泄漏(Memory Leak):是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。内存溢出(Memory Overflow):指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。一、OOM产生的原因1.1 一次性申请对象太多解决办法:更改申请对象的数量1.2 内存资源耗尽未释放解决办法: 找到未释放的对象进行释放1.3 本身资源内存不够解决办法:可以使用命令jmap -heap [pid]进程号 查看堆内存信息Attaching to process ID 13639, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.281-b09
using thread-local object allocation.
Parallel GC with 13 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize
= 8392802304 (8004.0MB)
NewSize
= 175112192 (167.0MB)
MaxNewSize
= 2797600768 (2668.0MB)
OldSize
= 351272960 (335.0MB)
NewRatio = 2
SurvivorRatio= 8
MetaspaceSize= 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 2007498752 (1914.5MB)
used = 1803799584 (1720.2373352050781MB)
free = 203699168 (194.26266479492188MB)
89.85308619509418% used
From Space:
capacity = 382205952 (364.5MB)
used = 0 (0.0MB)
free = 382205952 (364.5MB)
0.0% used
To Space:
capacity = 386400256 (368.5MB)
used = 0 (0.0MB)
free = 386400256 (368.5MB)
0.0% used
PS Old Generation
capacity = 5595201536 (5336.0MB)
used = 5588745280 (5329.842834472656MB)
free = 6456256 (6.15716552734375MB)
99.88461084094183% used
25889 interned Strings occupying 3069568 bytes.
二、OOM如何定位和解决的方法2.1 系统已经OOM挂了提前设置:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath= -jar xxxx.jar
2.2 系统运行中还未OOM导出dump文件:jmap -dump:format=b,file=xushu.hprof 14660 可能会造成一次FullGC和一次STW(stop the world),然后将hprof文件导入JAVA自带的JVM分析工具(在jdk的bin目录里面)叫做“jvisualvm.exe”。或使用Arthas软件2.3 结合jvisualvm进行调试查看最多跟业务有关对象->找到GCRoot->查看线程栈三、参考文献徐庶老师视频:https://www.bilibili.com/video/BV1fm4y1R7or/?spm_id_from=333.788内存泄漏和内存溢出有啥区别?张铎(信念)https://blog.csdn.net/zhanduo0118/article/details/118937567
分类专栏
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
内存溢出在开发中或者线上出现的概率很高,造成的直接原因就是系统运行缓慢,或者直接宕机了。小编在这里模拟下内存溢出的情况以防患于线上出现内存溢出要如何排查问题。题外话(线上出问题你需要生成一个快照(hprof文件),在本地查看问题),当然了还有其他工具调试如阿里的Arthas、还有MAT。我这里只演示jvisualvm。我使用的jdk版本是jdk1.8.0_05先准备一个可以出现内存溢出的代码模拟代码之后在IDEA中配置VM参数【-Xms2m -Xmx4m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:jvmtest】VM参数说明一下:-Xms 为jvm启动时分配的内存,比如-Xms2m,表示分配2M。-Xmx 为jvm运行过程中分配的最大内存,比如-Xmx4m,表示jvm进程最多只能够占用4M内存。 -XX:+HeapDumpOnOutOfMemoryError 表示出现OutOfMemoryError异常时,记录快照。 -XX:HeapDumpPath 表示快照的存储位置(这里可以设置文件名字,也可以不设置),不设置名字它会自己生成的。执行后,会抛出如下异常异常信息看到如下:Heap dump file created [5505387 bytes in 0.042 secs],那就计算下使用了多少M消耗多少M可以看得出,明显超出了4M。使用jvisualvm.exe来打开生成的hprof文件概要提示内存溢出了。点击main线程进入溢出位置看到了ArrayList,点进去ArrayList可以看得到ArrayList的存储大小(33384)。在点击到elementData看看里面存储的什么元素ArrayList里的元素可以清晰的看得出是TestOOMA$OOMObject这个对象,也就是我上面例子中的对象。另外在类视图中也可以看见这个对象在飙升。类视图也就分析出,内存溢出的原因就是因为疯狂的创建对象造成的。
热门文章
想要导航首页提示页_如何设计电商首页运营后台
21062
电脑显示器尺寸对照表_三分钟带你了解五花八门的显示器参数,买显示器不在跳坑...
10894
matlab 怎么使用function,Matlab怎么调用函数 自定义函数使用方法
9437
python两种基本的循环结构_Python的循环结构,也简单!
7494
python输入一个列表和两个整数作为下标_编写程序,用户输入一个列表和 2 个整数作为下标,然后输出列表中介于 2 个下标之间的元素组成的子列表。例如用户输入 [1,2,3,4,5,6] 和 2,5...
4733
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐

我要回帖

更多关于 java oom排查思路 的文章