(!待更)JVM虚拟机面试题:垃圾回收机制(对象什么时候可以被垃圾器回收、定位垃圾的两种方法、哪些对象可以作为GC Root、垃圾回收算法有哪些、垃圾回收三种算法对比总结)

对象什么时候会被垃圾器回收

如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾,如果定位到了这个垃圾,则有可能会被垃圾回收器回收。

定位垃圾

定位垃圾有两种算法,一个是引用计数法,一个是可达性分析算法。

引用计数法

一个对象被引用了一次,在当前的对象头上递增一次引用次数,如果这个对象的引用次数为0,代表这个对象可回收。
但是当对象间出现了循环引用的话,则引用计数法就会失效并可能产生内存泄漏,譬如以下的情况。
(!待更)JVM虚拟机面试题:垃圾回收机制(对象什么时候可以被垃圾器回收、定位垃圾的两种方法、哪些对象可以作为GC Root、垃圾回收算法有哪些、垃圾回收三种算法对比总结)_第1张图片


(!待更)JVM虚拟机面试题:垃圾回收机制(对象什么时候可以被垃圾器回收、定位垃圾的两种方法、哪些对象可以作为GC Root、垃圾回收算法有哪些、垃圾回收三种算法对比总结)_第2张图片

可达性分析算法(主流)

扫描堆中的对象,看是否能够沿着GC Root 对象为起点的引用链找到该对象,找不到,表示可以回收。如下图,X和Y是无法在GC Root对象为起点的引用链中找到的。
(!待更)JVM虚拟机面试题:垃圾回收机制(对象什么时候可以被垃圾器回收、定位垃圾的两种方法、哪些对象可以作为GC Root、垃圾回收算法有哪些、垃圾回收三种算法对比总结)_第3张图片

哪些对象可以作为 GC Root ?

栈中引用的对象

public static  void main(String[] args) {
    Demo demo = new Demo();
    demo = null;
}

类静态属性引用的对象

public static Demo a;public static  void main(String[] args) {
    Demo b = new Demo();
    b.a = new Demo();
    b = null;
}

常量引用的对象

public static final Demo a = new Demo();
public static  void main(String[] args) {
    Demo demo = new Demo();
    demo = null;
}

垃圾回收算法有哪些?

JVM包含标记清除算法、复制算法、标记整理算法。

标记清除算法

标记清除算法,是将垃圾回收分为2个阶段,分别是标记和清除。
1.根据可达性分析算法得出的垃圾进行标记
2.对这些标记为可回收的内容进行垃圾回收
(!待更)JVM虚拟机面试题:垃圾回收机制(对象什么时候可以被垃圾器回收、定位垃圾的两种方法、哪些对象可以作为GC Root、垃圾回收算法有哪些、垃圾回收三种算法对比总结)_第4张图片

标记整理算法

解决了标记清除算法的碎片化的问题,同时,标记压缩算法多了一步,对象移动内存位置的步骤,其效率也有一定的影响。
(!待更)JVM虚拟机面试题:垃圾回收机制(对象什么时候可以被垃圾器回收、定位垃圾的两种方法、哪些对象可以作为GC Root、垃圾回收算法有哪些、垃圾回收三种算法对比总结)_第5张图片

复制算法

(!待更)JVM虚拟机面试题:垃圾回收机制(对象什么时候可以被垃圾器回收、定位垃圾的两种方法、哪些对象可以作为GC Root、垃圾回收算法有哪些、垃圾回收三种算法对比总结)_第6张图片

对比总结

  • 标记清除算法:垃圾回收分为2个阶段,分别是标记和清除,效率高,有磁盘碎片,内存不连续
  • 标记整理算法:标记清除算法一样,将存活对象都向内存另一端移动,然后清理边界以外的垃圾,无碎片,对象需要移动,效率低
  • 复制算法:将原有的内存空间一分为二,每次只用其中的一块,正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收;无碎片,内存使用率低

分代回收

垃圾回收器的分类

https://www.bilibili.com/video/BV1Gv411W7Hb
适合整理总结概念回顾,不是很适合新学。
目前还没有找到b站上适合新学的这部分的教程。

你可能感兴趣的:(java虚拟机,jvm,算法,java,面试,后端)