背景
我们的Java程序在生产环境遇到比较常见的一个问题,出现这个问题往往还不是特别容易排查,本文就带着一种好奇的感觉去探索一下
造成Java进程异常终止的原因
- 内存泄漏直到内存溢出 (memory leak)
- 内存溢出 (out of memory)
- 被操作系统杀死(OOM-killer)
准备代码
https://github.com/niaoshuai/oom-samples场景模拟
一. OOM-Killer
使用 top 命令$ javac OOMKiller.java
$ java OOMKiller
使用 dmesg -T
二. 堆内存溢出(MetaSpace)
三. 堆内存溢出
四. 栈内存溢出
分析内存泄漏
一. 工具 eclipse mat
二. JDK自带工具Jhat
$ jhat -Xmx 1024M java_heapdump.hprof
分析线程以及CPU
通过jstack