一文让你理解什么是shallow heap及retained heap
前言 快速定位性能故障并非一朝一夕之功,需要我们对很多概念有很深刻的理解,在前文中,我们介绍了heap dump的相关概念和其获取方式,今天我们一起来了解一下什么是: Shallow 和 retained sizes。 GC ROOT是什么? 在java语言中,都是通过可达性分析来判定对象是否存活的。此算法的基本思路是:通过一系列的称为“GC Roots”的对象作为起点,从这些节点向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连,则证明此对象是不可达的。 在上图右侧中,我们可以看到,对象5/6/7虽然有依赖关联,但是他们到GC ROOT根节点是不可达的,所以这三个节点对象会被判定为是可回收的。 GC ROOT的定义比较特别,他们不属归属于对象图中,对象也不能反向的依赖他们,这也确保了不会出现循环引用的问题。因此也容易得出,只有引用类型的变量才被认为是Roots,值类型的变量永远不被认为是Roots。 在Java中,可作为GC Roots的对象包括以下几种: 虚拟机栈(栈帧中的局部变量表,Local Variable Table)中引用的对象。 方法区中类静态属性引用的对象。 方法区中常量引用的对象。 本地方法栈中JNI(即一般说的Native方法)引用的对象。 看到这里你可能要问,选择这些对象的依据是什么呢?