java中finalize()方法
finalize
垃圾回收机器(Garbage Collection),也叫GC,垃圾回收器主要有一下特点:
1、当对象不再被程序所使用的时候,垃圾回收器将会将其回收
2、垃圾回收是在后台运行的,我们无法命令垃圾回收器马上回收资源,但是我们可以告诉他可以尽快回收资源(System.gc()和Runtime.getRuntime().gc())
3、垃圾回收器在回收某个对象的时候,首先会调用该对象的finalize()方法
4、GC主要针对堆内存
finalize()
是Object里面的一个方法,当一个堆空间中的对象没有被栈空间变量指向的时候,这个对象会等待被java回收:jdk
里面是这样实现的:
protected void finalize() throws Throwable { } }
源码中显示的@Deprecated(since="9")
的意思就是说在jdk9以后这个方法就过时了(有其他的方法代替),但还是可以试验下…
1 public class testFinalize 2 { 3 public static void main(String[] args){ 4 5 Person p = new Person(); 6 p = null;//此时堆当中的Person对象就没有变量指向了,就变成了垃圾,等到垃圾回收机制调用的finalize()的时候会输出 7 //那句话 8 } 9 } 10 11 class Person 12 { 13 14 protected void finalize() throws Throwable{ 15 16 System.out.println("我快死了!!!"); 17 } 18 19 }
测试了几次,垃圾回收机制都没有启动(这点垃圾她真的看不上)。咱们程序员也不能强制垃圾回收器启动,但是可以适当建议她启动,毕竟人家傲娇得很呢嘛,下面这代码建议她启动(增加垃圾回收器启动的概率)。
1 public class testFinalize 2 { 3 public static void main(String[] args){ 4 5 Person p = new Person(); 6 p = null; 7 System.gc(); 8 9 10 } 11 } 12 13 class Person 14 { 15 16 protected void finalize() throws Throwable{ 17 18 System.out.println("我快死了!!!"); 19 } 20 21 }
你看看,你看看,人家还是不理你,看来得拿出点正当的手段了(就好比追女孩子一样,追不到,可以采取一些正当的手段,比如买束花什么的,会加分的吧…咱程序员也懂浪漫~)。改为如下代码:
1 public class testFinalize 2 { 3 public static void main(String[] args){ 4 5 Person p = new Person(); 6 //送点花 7 for(int i = 0 ; i< 1000; i++){ 8 p = null; 9 } 10 System.gc();//增加垃圾回收器启动的概率 11 } 12 } 13 14 class Person 15 { 16 17 protected void finalize() throws Throwable{ 18 19 System.out.println("我快死了!!!"); 20 } 21 22 }
现在就出来了…如果没出来可以把循环增加一下~
看来还是使点手段好用啊!
参考链接:https://blog.csdn.net/qq_37823003/article/details/107333386