完蛋!我被Out of Memory包围了!
是极致魅惑、洒脱自由的 Java heap space?
是知性柔情、温婉大气的 GC overhead limit exceeded? 是纯真无邪、活泼可爱的 Metaspace? 如果以上不是你的菜,那还有…… 刁蛮任性,无迹可寻的 CodeCache! 性感火辣、心思细腻的 Direct Memory 高贵冷艳,独爱你一人的 OOM Killer!
java.lang.OutOfMemoryError: Java heap space
分析解决起来无非是那几步:
dump 堆内存 通过 MAT、YourKit、JProfiler 、IDEA Profiler 等一系列工具分析dump文件 找到占用内存最多、最大的对象,看看是哪个小可爱干的 分析代码,尝试优化代码、减少对象创建 增加 JVM 堆内存、限制请求数、线程数、增加节点数量等
常见类库使用误区
Apache HttpClient
CloseableHttpClient httpClient = HttpClients.custom()
.setMaxConnPerRoute(maxConnPerRoute)
.setMaxConnTotal(maxConnTotal)
/// ...
.build();
Gson
Jackson
请求量可能并不大 不停 GC,并切暂停时间很长 时不时的还有新的请求,但响应时间很高 CPU 利用率很高
-XX:MaxMetaspaceSize=
java.lang.OutOfMemoryError: Metaspace
通过 Arthas 之类的工具,查看 ClassLoader、loadClassess 的数据,分析数量较多的 ClassLoader 或者 Class 打印每个 class 的加载日志:-XX:+TraceClassLoading -XX:+TraceClassUnloading
反射使用不当
一些 Agent 的 bug
动态代理问题
Server VM warning: CodeCache is full. Compiler has been disabled.
-XX:ReservedCodeCacheSize=
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffdbd5d19b4, pid=1208, tid=0x0000000000002ee0
#
# JRE version: Java(TM) SE Runtime Environment (8.0_301-b09) (build 1.8.0_301-b09)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.301-b09 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C [msvcr100.dll+0x119b4]
#
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
# http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
-XX:MaxDirectMemorySize=
如果 Direct Memory 达到 MaxDirectMemorySize 并且无法释放时,就会得到一个 OOM错误:
java.lang.OutOfMemoryError: Direct buffer memory
pmap 查看内存地址映射,定位可疑内存块、分析内存块数据 strace 手动追踪进程系统调用,分析内存分配的系统调用链路 更换jemalloc/tcmalloc之类的内存分配器(或者 async-profiler有个支持native 分析的分支)追踪malloc的调用链路
END
微信扫码关注该文公众号作者
戳这里提交新闻线索和高质量文章给我们。
来源: qq
点击查看作者最近其他文章