背景

我们的Java程序在生产环境遇到比较常见的一个问题,出现这个问题往往还不是特别容易排查,本文就带着一种好奇的感觉去探索一下

造成Java进程异常终止的原因

  1. 内存泄漏直到内存溢出 (memory leak)
  2. 内存溢出 (out of memory)
  3. 被操作系统杀死(OOM-killer)

    准备代码

    https://github.com/niaoshuai/oom-samples

    场景模拟

    一. OOM-Killer

    1. $ javac OOMKiller.java
    2. $ java OOMKiller
    使用 top 命令
    使用 dmesg -T
    内存溢出日志.png

    二. 堆内存溢出(MetaSpace)

    三. 堆内存溢出

    四. 栈内存溢出

分析内存泄漏

一. 工具 eclipse mat

二. JDK自带工具Jhat

  1. $ jhat -Xmx 1024M java_heapdump.hprof

分析线程以及CPU

通过jstack

参考链接

linux 内存溢出(oom)和内存泄漏(leak)【51CTO博客】 jvm OOM异常的模拟【CSDN】