/**
* 一、java的垃圾回收:
* 1.对象可能不被垃圾回收
* 2.垃圾回收并不等于"析构"(c++销毁对象函数)
* 3.垃圾回收只与内存有关
*
* 二、finalize()方法,在对象被垃圾回收时触发
*
* 三、手动触发垃圾回收的方式System.gc()等方法,或者不停new对象让jvm发现内存要不够用了
* 以上来自thinking in java 第四版
* @author rll
* @description: finalize()练习
* @date 2020/12/27 16:00
*/
class Book {
private int id = 0;
private boolean checkOut = false;
Book(boolean checkOut, int id) {
this.id = id;
this.checkOut = checkOut;
System.out.println("create b" + id);
}
void checkIn() {
this.checkOut = false;
}
@Override
protected void finalize() {
System.out.println("err:check out b" + id + " check " + checkOut);
}
}
public class TerminationCondition {
public static void main(String[] args) {
int num = 0;
Book b1 = new Book(true, num++);
b1.checkIn();
b1 = null; //b1为null,没有引用对象,会被回收
System.out.println("==========");//想通过分割线查看回收会不会在gc前执行
new Book(true, num++);
System.gc();
}
}
一、java的垃圾回收:
1.对象可能不被垃圾回收
2.垃圾回收并不等于"析构"(c++销毁对象函数)
3.垃圾回收只与内存有关
二、finalize()方法,在对象被垃圾回收时触发
三、手动触发垃圾回收的方式System.gc()等方法,或者不停new对象让jvm发现内存要不够用了
许多情况下,清理并不是问题,仅需让垃圾回收器完成该动作就行。但当必须亲自处理清理时,就得多做努力并多加小心。因为,一旦涉及垃圾回收,能够信赖的事就不会很多了。垃圾回收器可能永远也无法被调用,即使被调用,它也可能以任何它想要的顺序来回收对象。最好的办法事除了内存以外,不能依赖垃圾回收器去做任何事。如果需要进行清理,最好是编写你自己的清理方法,但不要使用finalize()。 ——《java编程思想》