在finalize方法注释上看到了“对于任何给定对象,Java 虚拟机永远不会多次调用finalize方法。”
那是不是意味着一个对象只能被复活一次呢?
package com.bz;
import java.util.ArrayList;
import java.util.List;
/**
* @Description
* @Author zhaokun
* @Date 2021/9/1
* @Version 1.0
**/
public class Person {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static Person p;
@Override
protected void finalize() throws Throwable {
System.out.println(this + "对象被回收--" + Thread.currentThread().getName());
Person.p = this;
}
public static void main(String[] args) {
p = new Person();
p = null;
// 第一次gc
System.gc();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 放在睡眠后 是因为finalize方法是由Finalizer线程执行,优先级比较低,执行没有那么及时
System.out.println(p);
p = null;
// 第二次gc
System.gc();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(p);
}
}
打印结果
由此可见对象的finalizer方法只能被执行一次,防止对象无法被回收,造成内存泄漏