jvm垃圾收集器具体实现

2020-06-20 11:22栏目:编程
TAG: java

引用计数算法:每个对象都包含一个引用计数器,用地方引用他时,就+1,引用失效就 -1.为0是就是不可再用,会被gc回收。优势:实现简单高效,缺陷:无法解决对象间相互引用的问题。
java虚拟机并未采用此算法来管理内存。
可达性分析法:从"GC Roots"的对象作为起始点,从这些节点开始向下搜索,没有被GC Roots的引用链包含的话,则说明对象不可用,会被判定为可回收对象。
GC Roots对象包括:
虚拟机栈(栈帧中的局部变量表)中引用的对象;
方法区中类静态属性引用的对象;
方法区中常量引用的对象;(也就是类中的final引用对象);
本地方法栈中JNI(java native interface)中native方法引用的对象。
java对引用的概念在1.2之前只存在被引用和没用被引用的状态,如果希望一些对象在内存足够的时候能保留在堆中,在内存空间进行垃圾收集后仍然很紧张的情况下,才去回收这些对象,比如说很多系统的缓存功能。
jdk1.2之后扩充了引用的概念,引用分为强引用(Strong Reference),软引用(Soft Reference),弱引用(Weak Reference)和虚引用(Phantom Reference)
强引用:Object obj = new Object() 只要强引用存在,就不会被GC
软引用:用来描述一些还有用但是并非必需的对象,当系统内存在回收后依旧紧张的情况,会将这些对象列入下次回收的名单中(一般用于内存敏感的高速缓存)。SoftReference类来实现。
弱引用:弱引用关联的对象只能生存到下次垃圾收集发生之前,采用WeakReference类来实现弱引用。
虚引用:实际场景中基本不用。
可达性分析法中不可达的对象判断真正死亡需要经历2个标记步骤,第一次是没有与GC Roots相连接的引用链,然后,jvm会判断当前对象是否覆盖了finalize()方法或者是否被执行过,如果都没有则判定死亡,否则会先将对象放置到F-Queue队列中,然后交由jvm去发现执行。finalize()方法是对象最后逃脱死亡的机会。将自身this赋给类变量或者对象的成员变量。但是finalize()方法只会被执行一次,第二次自救会直接被回收。finalize()不建议使用,尽量采用try finally来替代。
方法区的回收一般回收废弃常量和无用的类。

上一篇:改写mybatis-plus租户插件,实现租户数据隔离

本文来自网络,不代表山斋月平台立场,转载请注明出处: https://www.shanzhaiyue.top