内存溢出分类
Java 外面内存溢出次要分以下几种:
堆溢出
1、内存溢出(无奈申请到内存)
jstat 查看内存应用状况,查看堆参数,个别是申请的内存太大,比方一个特地大的 byte 数组
2、内存透露(对象无奈回收)
能够应用 MAT 工具外面的 Path to GC Roots 定位,个别是一个特大不能回收的对象
栈溢出
- StackOverflowError
办法调用档次太深,内存不够新建栈帧,比方一个没有完结条件的递归 - 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.txtjmap -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 的集体博客 发表。