深刻理解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 }
相關文章
相關標籤/搜索