上篇文章介绍了JVM内存模型的相关知识,其实还有些内容可以更深入的介绍下,比如运行时常量池的动态插入,直接内存等,后期抽空再完善下上篇博客,今天来介绍下JVM中的一些垃圾回收策略。
一、finailize()方法
在介绍GC策略前,先介绍下GC中的finailize方法。当对象没有任何引用的时候,通常这个对象会被回收掉,但如果我们想在对象被回收前进行一些操作,比如关闭一些资源,或者让这个对象复活,不让他被回收怎么办?这时候就要用到finailize方法了。finailize方法是Object类中定义的方法,意味着任何一个对象都有这个方法。但这个方法只会调用一次,如果把这个对象复活后再次让这个对象死亡,那第2次回收该对象的时候是不会调用finailize方法的,而且优先级比较低,并不能保证一定会被执行,因此不建议使用finalize方法。总结起来就是3个特性: ①、GC之前被调用 。②、只会被调用一次。③、不可靠,不能保证被执行,不建议使用。关于finalize使用方法,参考如下代码:

1 public class FinalizeTest {
2
3 private static FinalizeTest test;
4 /**
5 * VM参数:-XX: +PrintGCDetails -Xmx=1M -Xms=1M
6 *
7 * @param args
8 */
9 public static void main(String[] args) {
10 //先对test对象赋值
11 test = new FinalizeTest();
12 int _1m = 1024 * 1024;
13 //将test置为null,便于回收
14 test = null;
15 try {
16 System.gc();
17 //模拟睡眠5s,finalize优先级较低,保证finalize能执行
18 Thread.sleep(5000);
19 } catch (InterruptedException e) {
20 e.printStackTrace();
21 }
22 if (test != null) {
23 System.out.println("first,i am alive");
24 }else{
25 System.out.println("first,i am dead");
26 }
27 //由于test在finalize方法里复活了,再次将test置为null
28 test = null;
29 try {
30 System.gc();
31 Thread.sleep(5000);//模拟睡眠5s,让GC回收
32 } catch (InterruptedException e) {
33 e.printStackTrace();
34 }
35 if (test != null) {
36 System.out.println("second,i am alive");
37 }else{
38 System.out.println("second,i am dead");
39 }
40
41 }
42 @Override
43 protected void finalize() throws Throwable {
44 test = this ;
45 System.out.println("finalize excuted");
46 super.finalize(); //调用父类的finailize方法
47 }
48 }
本文深入探讨JVM中的垃圾回收策略,重点介绍finalize方法的使用及其限制,通过实例演示对象如何在GC前进行资源清理或复活,揭示其调用机制及可靠性问题。


被折叠的 条评论
为什么被折叠?



