OOM快速线上定位原因和排查
博主最近登录服务器发现某个项目发生了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
版权声明:本文为weixin_40924043原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。