Java 垃圾回收 - 可达性分析算法

  续前节,前面总结了Java内存运行时区域划分的各个部分,分别:JVM虚拟机栈、本地方法栈(JDK Native方法执行所需)、程序计数器、堆内存、方法区、方法区常量池。其中JVM 虚拟机栈、本地方法栈、程序计数器3个区域会随线程而生,随线程而死。栈帧中的操作随着方法区的进入和推出进行相关的入栈和出栈操作。每个栈帧的大小随着方法结构而确定下来的。

  1、对象生死确定  

  堆内存存放着一个程序中所需的所有实例对象。垃圾回收机制主要针对堆内存进行回收。在执行回收之前首先要确定对象是否还在被引用。

  普遍判断对象是否存活的方法是通过引用计数法,指的是:当对象被引用,程序计数器+1;释放-1;当为0时证明对象未被引用。可回收。但是Java中并未采用次方法。

  Java采用可达性分析法 来确认对象是否存活。

  所谓可达性分析法是指的,通过一些列称之为“GC Roots” 的对象作为起点;从此起点向下搜索,所走过的路径称之为引用链,当一个对象到 GC Roots 没有任何引用链相连接,代表此对象不可达。

  如图所示:

  

  Java 可以作为GC Roots 的对象包括:

  • 虚拟机栈(帧栈中的本地变量表)中的引用对象。
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI (即一般说的 Native 方法) 的引用对象

  2、Java 引用

  java中把内存中对象的引用分成了四个等级,在不同程度下进行垃圾的回收工作。按照回收优先级顺序分为:虚引用 -> 弱引用 -> 软引用 -> 强引用。如下图

  

 

posted @ 2019-07-15 10:56  Axuduo  阅读(886)  评论(0编辑  收藏  举报