(1). 内存泄露与内存溢出的区别

内存泄露(Memory Leak):
是指程序在申请内存后,无法释放已申请的内存空间(指分配出去的内存无法被gc回收).一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光.
内存溢出(Out Of Memory):
指程序要求的内存超出了系统所能分配的范围,出现Out Of Memory,比如:创建一个大的对象,而堆内存放不下这个对象,这也是内存溢出.

(2). Shallow Size / Retained Size详解

Shallow Size:
就是对象本身占用内存的大小,不包含对其他对象的引用,也就是对象头加成员变量(不是成员变量的值)的总和.在32位系统上,对象头占用8字节,int占用4字节,不管成员变量(对象或数组)是否引用了其他对象(实例)或者赋值为null它始终占用4字节.故此,对于String对象实例来说,它有三个int成员(34=12字节)、一个char[]成员(14=4字节)以及一个对象头(8字节),总共34 +14+8=24字节.根据这一原则,对String a=”rosen jiang”来说,实例a的Shallow Size也是24字节.
Retained Size:
是该对象自己的Shallow size,加上从该对象能直接或间接访问到对象的shallow size之和.换句话说,retained size是该对象被GC之后所能回收到内存的总和.
左图:object1的大小就是:Shallow Size,而,object1下的对象(object2/object3/object4)所有蓝色对象就是该对象直接或间接引用的Retained Size.
右图:object4的大小就是:Shallow Size,但是,object4没有:Retained Size.

"Shallow Size / Retained Size详解"

(3). Heap Dump

Heap Dump是Java进程在某个时刻的内存快照,不同JVM的实现的Heap Dump的文件格式可能不同,进而存储的数据也可能不同.
Heap Dump包含以下内容:

  1. 对象信息:类名、属性、基础类型和引用类型.
  2. 类信息:类加载器、类名称、超类、静态属性.
  3. gc roots:JVM中的一个定义,进行垃圾收集时,要遍历可达对象的起点节点的集合.
  4. 线程栈和局部变量:快照生成时候的线程调用栈,和每个栈上的局部变量.

(4). Dominator Tree(支配树)

支配树是:基于对象的引用关系图建立的,通过支配树可以很清楚得看到对象之间的依赖关系.

(5). 生成离线dump方式

> 1. 命令格式(jmap -dump,format=b,file=heap.bin *pid*).   
> 2. 指定JVM参数(-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${HOME}/dumps)  

(6). OOM排查经历

“Reactor Stream OOM排查过程”
“Apach HttpClient OOM排查过程”
“Fastjson OOM排查过程”