package com.sr178.test;
public class TestA {看下面程序
public static void main(String[] args) { foo f = new foo();
foo f2 = f;
f=null;
System.gc();
}
}
class foo{
protected void finalize(){
System.out.println("该对象被回收了");
}
}
当f=null之后,f指向的内存foo对象会被垃圾回收器回收,那么变量f本身对应的内存会不会被回收啊``要是会被回收,什么时候回收的?
谢谢先```
public class TestA {看下面程序
public static void main(String[] args) { foo f = new foo();
foo f2 = f;
f=null;
System.gc();
}
}
class foo{
protected void finalize(){
System.out.println("该对象被回收了");
}
}
当f=null之后,f指向的内存foo对象会被垃圾回收器回收,那么变量f本身对应的内存会不会被回收啊``要是会被回收,什么时候回收的?
谢谢先```
foo f2 = f;
f=null; //此行执行以后,第一行创建的对象也不符合垃圾回收条件,因为第二行中的f2指向了那个对象。
protected void finalize(){ //此方法切记处理异常,不然会编译错误吧
System.out.println("该对象被回收了");}
“当f=null之后,f指向的内存foo对象会被垃圾回收器回收,那么变量f本身对应的内存会不会被回收啊``要是会被回收,什么时候回收的? ” //这句话错的哈,当f=null之后,介于此题,f指向的内存foo对象不会被垃圾回收器回收
谢谢````
所以当f=null之后,变量f本身对应的内存不会立刻被回收,只是通知垃圾回收器又需要回收的对象。
用System.gc(),只能建议JVM进行垃圾回收,但垃圾回收工作也不一定执行
JVM只是保证你在需要内存的时候,给你内存,这是其他语言没法比拟的(个人认为是JAVA最成功的 )
而且即使调用了 System.gc()方法也未必会回收,因为何时回收是由java虚拟机决定的,程序无法决定。只是向java虚拟机提出垃圾回收的建议