JVM高级特性-三、垃圾收集之判断对象存活算法

一、概述

  运行时数据区中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭的

  因此,他们的内存分配和回收是确定的,在方法或线程结束时就回收。而Java堆和方

  法区则是不确定的,程序运行过程中创建对象的大小是不定的,只有在程序处于运行

  期才能知道所需内存的大小

 

二、“存活算法”

  要判断对象是否存活,主要有两种算法:引用计数法和可达性分析算法

  • 引用计数法

    引用计数法就是给对象加上一个引用计数器,每当对象被 引用一次

  计数器值就加1,引用时效则减1,计数器为0则表示不会再被使用。

 

  • 可达性分析算法

    可达性分析算法是主流的实现,这个算法通过成为GC ROOT的节点作为根节点,

  从此根节点向下搜索,若对象到GC ROOT没有引用链相连(即不可达)时,表示该

  对象不可用

    可作为GC ROOT的对象为:

      • 虚拟机栈中本地变量表里的引用对象
      • 方法去中的类静态属性引用独享
      • 方法去中的敞亮对象
      • 本地方法中的引用对象

  目前可达性分析算法已是主流算法,原因是,引用计数器算法无法解决对象互相引用的问题

  • 可达性分析判断过程

   对对象进行可达性分析之后,发现他没有任何引用链相连,则对他进行第一次标记,并进行一次筛选,

   筛选条件是是否需要执行finalize()方法,当对象没有覆盖finalize方法或已经finalize方法已经被调用过,

   则认为没有必要执行,如果判断为有必要执行,则会将他放入一个叫做F-Queue的队列中,稍后JVM

   会自动建立一个低优先级的finalizer线程去执行这些对象的finalize方法,之后GC会对F-QUEUE中的对

   象进行第二次标记,如果此时对象扔没逃脱,则将被回收。

  •  finalize()方法

   上面多次提到finalize方法,要注意,对象的finalize方法只会被系统自动调用一次。

   不建议大家使用这个方法,他的功能完成可以用try-finally替代

 

   

    

posted @ 2017-06-17 15:42  onlinemf  阅读(722)  评论(0编辑  收藏  举报