深刻理解JAVA虚拟机学习笔记(二)垃圾回收策略

 上篇文章介绍了JVM内存模型的相关知识,其实还有些内容能够更深刻的介绍下,好比运行时常量池的动态插入,直接内存等,后期抽空再完善下上篇博客,今天来介绍下JVM中的一些垃圾回收策略。ide

       1、finailize()方法              this

            在介绍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 }
相关文章
相关标签/搜索