乐趣区

关于后端:程序员知识图谱Java-内存溢出的排查方法

内存溢出分类

Java 外面内存溢出次要分以下几种:

堆溢出

1、内存溢出(无奈申请到内存)
jstat 查看内存应用状况,查看堆参数,个别是申请的内存太大,比方一个特地大的 byte 数组

2、内存透露(对象无奈回收)
能够应用 MAT 工具外面的 Path to GC Roots 定位,个别是一个特大不能回收的对象

栈溢出

  1. StackOverflowError
    办法调用档次太深,内存不够新建栈帧,比方一个没有完结条件的递归
  2. OutOfMemoryError
    线程太多,内存不够新建线程

MetaSpace 数据区溢出

动静生成大量 Class

本地间接内存溢出

申请一个大的间接内存

数据超限内存溢出

调配的数据结构在此平台不可寻址

排查办法

JDK 自带命令

jstat -gcutil 33816 250 20 # 监控 jvm 的内存应用状况
jps -ml # 输入虚拟机启动时传递给主类 main() 的参数,输入主类的全名
jmap -F -dump:live,format=b,file=dump.bin 85962 # dump 堆内存
# 分析方法
# 能够应用 VisualVM,次要查看是否存在大对象,而后剖析为什么没有被回收
jstack -F -l -m 85962 # 显示虚拟机快照
jstack -l PID >> test.txt
jmap -histo pid # 实时查看 JVM 对象大小的排序后果,但无奈看到对象的具体内容 

Arthas

# 找到最耗 CPU 的办法
thread -n 5
# 察看办法的返回
watch com.test.MyClass query returnObj
# 反编译类
jad com.test.MyClass
# 监控调用状况
monitor -c 5 com.test.MyClass query
# 查看分段的调用工夫
trace com.test.MyClass query
# 查看办法残缺的调用链
stack com.test.MyClass query
# 记录调用现场
tt -t com.test.MyClass query

参数查看

-Xms 初始堆大小
-Xmx 最大堆大小
-Xmn 新生代大小
XX:MaxMetaSpaceSize 元数据区大小
Survivor Eden 与 Survivor 区的大小比值 

本文亦通过 NoOne 的集体博客 发表。

退出移动版