JVM进阶(六):鲜为人知的二次标记_java虚拟机 gc为什么需要2次标记

31 阅读3分钟
	testHelp(); // 第一次调用
	testHelp(); // 第二次调用
}
public static void testHelp() throws InterruptedException {
	test = null; // 将其从关系网中移出
	// 通知要进行垃圾回收,但不一定会执行垃圾回收,只是一个通知而已
	// 因此在开发中不要过多的依赖这个方法,这里只是做个测试
	System.gc();
	// 等待1s,让低优先级的线程执行完
	Thread.sleep(1000);
	if(test === null){
		System.out.println("我挂啦");
	} else {
		System.out.println("我还活着");
	}
}
@override
protected void finalize() throws Throwable {
	super.finalize();
	test = this; // 将其重新加入关系网中
	System.out.println("我被调用啦");
}

}


大家觉得结果会输出什么?最后的结果是:



> 
> 我被调用啦  
>  我还活着  
>  我挂啦
> 
> 
> 


有木有觉得很诧异,明明调用了两次同样的方法,但输出怎么不同呢?而且明明调用了两次gc()方法(这里确认是执行了gc),那怎么只进入了一次`finalize()`方法?


嘿嘿,其实面对同一个对象,`finalize()`方法只会被调用一次,因此第一次调用的时候会进行`finalize()`方法,并且成功的将该对象加入了“关系网”中,但当第二次回收的时候并不会进入,所以第二次不能将对象加入“关系网”中,导致被回收了。


上面的代码块中有一行让程序睡眠一秒钟的代码,为的就是确保让低优先级的执行finalize()方法线程执行完成。那如果我们把他注释了会怎样呢?输出结果是:



> 
> 我挂啦  
>  我被调用啦  
>  我挂啦
> 
> 
> 


很奇怪吧,不过如果执行很多次的话,也会出现最开始那样的结果,但多数会是这个结果。因为我们已经说了,执行`finalize()`的是一个低优先级的线程,既然是一个新的线程,虽然优先级低了点,但也是和垃圾收集器并发执行的,所以垃圾收集器没必要等这个低优先级的线程执行完才继续执行。也就是说,`finalize()`方法不一定会在对象第一次标记后执行。用一句清晰易懂的话来说就是:虚拟机确实有调用方法的动作,但是不会确保在什么时候执行完成。因此也就出现了上面输出的结果,对象被回收之后,那个低优先级的线程才执行完。


### 三、拓展阅读


* 《[JVM虚拟机专栏]( )》  
 ![这里写图片描述](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/8e0dee4bbdfe4d2d90f4f2f819132da9~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1771418950&x-signature=1G9V%2FCPG8%2BYQfY69O8UgfPMu3ZA%3D)






##### 框架相关

原生JS虽能实现绝大部分功能,但要么就是过于繁琐,要么就是存在缺陷,故绝大多数开发者都会首选框架开发方案。现阶段较热门是React、Vue两大框架,两者工作原理上存在共通点,也存在一些不同点,对于校招来说,不需要两个框架都学得特别熟,一般面试官会针对你简历中写的框架进行提问。

在框架方面,**生命周期、钩子函数、虚拟DOM这些基本知识是必须要掌握的**,在学习的过程可以结合框架的官方文档



**Vue框架**

>**知识要点:**
>**1. vue-cli工程**
>**2. vue核心知识点**
>**3. vue-router**
>**4. vuex**
>**5. http请求**
>**6. UI样式**
>**7. 常用功能**
>**8. MVVM设计模式**

![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/1cc991f17f2c42dcb6a1bcb59e1cd375~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1771418950&x-signature=KbnpTHGc03Ws6UVbzB1YKA4OVBY%3D)


**React框架**

>**知识要点:**
>**1. 基本知识**
>**2. React 组件**
>**3. React Redux**
>**4. React 路由**

![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/b0998f691ae44755a28a215ffebfdbaa~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3NTc5MjMwMTY3MDI=:q75.awebp?rk3s=f64ab15b&x-expires=1771418950&x-signature=SigjTWzol950YI0LCRWf23jckyk%3D)


**开源分享:https://docs.qq.com/doc/DSmRnRGxvUkxTREhO**