首先,一般情况下,jvm在内存不足的时候才会进行垃圾回收!
当没有输入引数运行你的程序,可以得出你所说的输出,
个人看来,程序在生成第47个对象时,并没有达到内存(这里可能包括物理和虚拟的,由jvm判断)的最大值,所以,f没有置为true,对象仍然在生成,直到内存耗尽,jvm开始进行垃圾回收,这时才执行你在chair里定义的finalize()方法,当释放第47个对象时,f经过被置为true,这时,就不会再产生新的对象了。这与47没有关系,你可以在
Chair() {
i = ++created;
if(created == 47)
System.out.println("Created 47");
}
中改为
if(created == 47)
{
System.out.println("Created 47");
f= true;
}
,这时生成47个对象后就不会再生成了。内存没有消耗完,所以不会调用finalize 。
你自己再理解一下。
当没有输入引数运行你的程序,可以得出你所说的输出,
个人看来,程序在生成第47个对象时,并没有达到内存(这里可能包括物理和虚拟的,由jvm判断)的最大值,所以,f没有置为true,对象仍然在生成,直到内存耗尽,jvm开始进行垃圾回收,这时才执行你在chair里定义的finalize()方法,当释放第47个对象时,f经过被置为true,这时,就不会再产生新的对象了。这与47没有关系,你可以在
Chair() {
i = ++created;
if(created == 47)
System.out.println("Created 47");
}
中改为
if(created == 47)
{
System.out.println("Created 47");
f= true;
}
,这时生成47个对象后就不会再生成了。内存没有消耗完,所以不会调用finalize 。
你自己再理解一下。
每创建回收一个对象都会执行一次finalize()函数以下例子可以证实:
public class person{
public void finalize(){
System.out.println("destory Object!");}
public static void main(String [] args){
new person();
new person();
System.gc();
}
}
程序打出两行destory Object!程序并不是产生到第47个对象时停止产生对象,而是回收到第47个对象时停止产生对象。
当没有提供引数运行程序时,我们知道什么时候回收垃圾吗?
很明显,我们不知道。但是程序的结果告诉了我们。
第一次调用finalize()函数时程序产生了5430个对象,
当程序不再产生对象时,程序已经产生了34544个对象。为什么程序没有打出5430行字符或更多呢?
程序用多个变量巧妙的控制了他们。一点拙见!!
比如那些没有引用的对象啦?
2.finalize()的执行由gc决定,可以执行也可以不执行,所以不能用finalize()保证释放某些资源
3.一般来说只有内存不够了才会执行gc,所以一般的程序可能根本没有搜集垃圾
动调用System.gc(),jvm也不会立刻回收吗? 那么System.gc()的作用是什么呢?
还有就是当垃圾回收释放对象时 具体有什么动作?比如上例 回收器它对i有什么动作呢?
调用System.gc()是建议垃圾回收,但是不一定会回收,不过会加大回收的可能性.
垃圾回收时会调用finalize方法,但是因为不知道什么时候垃圾回收,所以不要在finalize方法
释放资源.
垃圾回收随时都有可能运行,并不是说内存不足才启动的