不积跬步,无以至千里;不积小流,无以成江海。
Java语言基础
Java的对象销毁:
Java的内存清理是通过垃圾回收器进行的,当垃圾回收器准备回收对象内存的时候,首先会调用对象的finalize()方法,并且在下一次垃圾回收动作发生的时候真正回收对象的内存。既然会调用对象的这个方法就说明所有的类都会有这个方法(因为所有的类都可能会被回收)。
先看Java的根类 Object:
protected void finalize() throws Throwable { }
这是一个实现为空的方法,既然是protected就说明具体的方法可以留给子类去实现。
我们也知道当对象不再被任何引用指向时候,该对象才会被回收。那么具体情况如何呢?
class User { private int money; public int getMoney() { return money; } public void setMoney(int money) { this.money = money; } public void cool() { System.out.println("Money!"); } @Override protected void finalize() throws Throwable { // TODO Auto-generated method stub super.finalize(); System.out.println("finalize methode executed"); System.out.println(this); } }
我们重写了finalize()方法,接着对其进行测试:
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub User user = new User(); System.out.println(user); user = null; System.out.println(user); new User(); } }
程序输出:
User@15db9742 null
我们发现运行结束之后,user并没有被回收,就连没有任何引用指向的new User()也没有被回收。
Thinking In Java中是这样解释的:Java中的并非总是被垃圾回收,也就是说对象可能不被回收。一般程序只要不到濒临存储空间用光,垃圾回收器一般都不会主动回收内存,如果程序结束,并且垃圾回收器一直没有释放你创建的空间,则随着程序的退出,资源则会被归还给操作系统。所以上面的我们finalize()才一直没有被调用。
这里我们可以使用System.gc(),强制系统垃圾回收器工作:
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub User user = new User(); System.out.println(user); user = null; System.out.println(user); System.gc(); } }
程序输出:
User@15db9742 null finalize methode executed User@15db9742
可以看到创建的对象user被回收了。
博客借鉴:https://www.jianshu.com/p/993b046a40b6
原文:https://www.cnblogs.com/smilexuezi/p/12675677.html