上篇文章介紹了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 }