目录
- [1- 引言:](#1- 引言:)
- [2- ⭐核心:](#2- ⭐核心:)
-
- [2-1 排查思路](#2-1 排查思路)
- [2-2 步骤1:获取堆内存快照 dump](#2-2 步骤1:获取堆内存快照 dump)
- [2-3 步骤2、3:使用 VisualVM 打开 dump文件](#2-3 步骤2、3:使用 VisualVM 打开 dump文件)
- [3- 小结:](#3- 小结:)
-
- [3-1 Java内存泄漏排查思路?](#3-1 Java内存泄漏排查思路?)
1- 引言:
首先得明确哪里会产生内存泄漏的问题?
- 在运行时数据区中的三个部分容易产生内存泄漏的问题
- JVM Stacks 虚拟机栈 ------> StackOverFlowError
- Method Area/MateSpace 方法区/元空间------> OutOfMemoryError:Metaspace
- Heap 堆------>OutOfMemoryError:java heap space
- 一般需要重点关注的是堆空间的内存泄漏问题,比如大对象一直存活。
2- ⭐核心:
2-1 排查思路
假设在服务器中部署了很多微服务,每个微服务实际上都是一个项目。
每个项目都可能导致内存溢出,比如项目出现了启动时闪退,运行一段时间宕机的问题如何排查?
排查思路
- 1.获取堆内存快照 dump
- 2.VisualVM 去分析 dump 文件
- 3.通过查看堆信息的情况,定位内存溢出问题
2-2 步骤1:获取堆内存快照 dump
1- 通过 jmap
指定打印他的内存快照 dump(dump文件是进程的内存镜像,可以把陈故乡的执行状态通过调试器保存到 dump 文件中)
- 如果项目在正常运行 :使用
jmap
命令获取运行中程序的 dump 文件 format=b
指定格式为 二进制文件file=heap.hprof
设置文件存储的路径
bash
jmap -dump:format=b,file=heap.hprof pid
- 如果程序没有正常运行
- 有的情况是内存溢出之后,程序会直接中断,而
jmap
只能打印在运行中的程序,生成 dump文件,可以使用一下vm
参数
bash
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/app/dumps
2-3 步骤2、3:使用 VisualVM 打开 dump文件
- 通过查看堆信息的情况,定位内存溢出问题
- 分析内存泄漏的远原因