关于java垃圾回收器 变量回收的问题

java05 2008-11-12 03:28:04
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本身对应的内存会不会被回收啊``要是会被回收,什么时候回收的?
谢谢先```
...全文
368 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
lliiqiang 2009-03-30
  • 打赏
  • 举报
回复
因为f2也指定这个对象,所以不会立即被回收,只有方法进行完了,才有可能回收。
而且即使调用了 System.gc()方法也未必会回收,因为何时回收是由java虚拟机决定的,程序无法决定。只是向java虚拟机提出垃圾回收的建议
whlxjq520 2009-02-26
  • 打赏
  • 举报
回复
遇到 类似的问题 来学习的
echoabs 2008-11-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 natee 的回复:]
垃圾回收(gc)是一个优先级为0的守护进程,什么时候执行是说不准的,你也不能强制执行,就算你调用System.gc()也没用

foo f = new foo();
foo f2 = f;
f=null; //此行执行以后,第一行创建的对象也不符合垃圾回收条件,因为第二行中的f2指向了那个对象。


protected void finalize(){ //此方法切记处理异常,不然会编译错误吧
System.out.println("该对象被回收了");

}


“当f=null之后,…
[/Quote]
正解,关于GC什么时候回收不是人为能控制的,就算你强制回收也没有用!!!
StarNCraft 2008-11-13
  • 打赏
  • 举报
回复
方法执行完了,自然就释放了!
java05 2008-11-13
  • 打赏
  • 举报
回复
看着有很多仁兄都理解错了我要问的问题,不过问题已经解决....

当然上面也有很多人说对了...总结下

当定义 foo f 的时候,首先系统将会将变量f添加到变量列表里..

当定义f= new foo();时,先是在内存中生成一个foo对象,然后f再去指向这个对象.这里也会在内存中为f分配内存空间.(其实java没有栈和堆之分的,他实现的是个池,变量和对象都放在这里,不知道这个理解对不,望高手指点)

当定义 f=null;时,并执行 system.gc()时(这里假定jvm马上回收内存,大家别在就个地方为难小弟了);

系统就会回收变量f和对象foo的内存,但此时变量列表还有f的存在,变量列表里的f是在其走出作用域的时候被系统删除的.

所以当继续赋值 f= new foo();的时候还能找到f.

这个就是我现在理解的过程...

如果有错误,请大家帮忙指出.....
badlove3 2008-11-13
  • 打赏
  • 举报
回复
学习~
natee 2008-11-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 shengli_liao 的回复:]
一堆一堆的教科书上的废话
对实际应用没有任何好处的废话
呜呼~~~~~~~~~~~~~~~~
[/Quote]


虽然只是些理论知识,但了解下还是没有错的,再说SCJP那些考试就考这个...
静水s 2008-11-13
  • 打赏
  • 举报
回复
路过,顺便学习
shengli_liao 2008-11-13
  • 打赏
  • 举报
回复
一堆一堆的教科书上的废话
对实际应用没有任何好处的废话
呜呼~~~~~~~~~~~~~~~~
moshangchenzi 2008-11-13
  • 打赏
  • 举报
回复
Java中垃圾回不回收,什么时候回收是JVM的事,是没办法控制的
用System.gc(),只能建议JVM进行垃圾回收,但垃圾回收工作也不一定执行
JVM只是保证你在需要内存的时候,给你内存,这是其他语言没法比拟的(个人认为是JAVA最成功的 )
mldxs 2008-11-13
  • 打赏
  • 举报
回复
f=null在会被回收
shuaiAWP 2008-11-13
  • 打赏
  • 举报
回复
mark
ZangXT 2008-11-12
  • 打赏
  • 举报
回复
f在main方法的stack frame 里,main方法执行完的时候就没有了。
natee 2008-11-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 java05 的回复:]
晕````那去掉foo f2 = f; 那句吧```我忘删了``
谢谢````
[/Quote]


你去掉后也不一定会被垃圾回收啊。你去掉后,只能说明它符合垃圾回收的条件,但回不回收,什么时候回收是JVM的事,跟你没关系,你也管不了,你用System.gc(),只能建议JVM进行垃圾回收,但垃圾回收工作也不一定执行。反正一句话,你管不了...
qixin000 2008-11-12
  • 打赏
  • 举报
回复
你声明的是局部变量,应该是在栈中的,他所指向的对象被分配在堆中,垃圾回收器只回收堆中的对象
对于你的变量在程序走出作用域,自然就释放掉了

垃圾回收的时候,通常从栈中出发,到堆中寻找垃圾对象,然后收集
shenjie1989 2008-11-12
  • 打赏
  • 举报
回复
在java中尽管存在垃圾回收器,但是依然会出现内存泄露的问题,这是因为在程序中可能存在垃圾回收器无法收集的持续存在的无用引用。当不再使用一个对象时,最好明确置对象为null,但这并不能控制垃圾回收器立刻工作,只是做到通知垃圾回收器有需要回收的对象。如果系统中可用的内存过低,系统也会自动运行垃圾回收器释放对象占用的内存资源供其他对象使用。
所以当f=null之后,变量f本身对应的内存不会立刻被回收,只是通知垃圾回收器又需要回收的对象。
java05 2008-11-12
  • 打赏
  • 举报
回复
晕````那去掉foo f2 = f; 那句吧```我忘删了``
谢谢````
qixin000 2008-11-12
  • 打赏
  • 举报
回复
你声明的是局部变量,应该是在栈中的,他所指向的对象被分配在堆中,垃圾回收器只回收堆中的对象
对于你的变量在程序走出作用域,自然就释放掉了
natee 2008-11-12
  • 打赏
  • 举报
回复
垃圾回收(gc)是一个优先级为0的守护进程,什么时候执行是说不准的,你也不能强制执行,就算你调用System.gc()也没用

foo f = new foo();
foo f2 = f;
f=null; //此行执行以后,第一行创建的对象也不符合垃圾回收条件,因为第二行中的f2指向了那个对象。


protected void finalize(){ //此方法切记处理异常,不然会编译错误吧
System.out.println("该对象被回收了");

}


“当f=null之后,f指向的内存foo对象会被垃圾回收器回收,那么变量f本身对应的内存会不会被回收啊``要是会被回收,什么时候回收的? ” //这句话错的哈,当f=null之后,介于此题,f指向的内存foo对象不会被垃圾回收器回收
捏造的信仰 2008-11-12
  • 打赏
  • 举报
回复
另外,“当 f=null 之后,f 指向的内存 foo 对象会被垃圾回收器回收”不够准确。GC 算法在不同的虚拟机里会有所区别,Java 程序本身是不能控制的。

绝大多数情况下,xxx=null 这样的语句完全没有必要写,也不需要显式调用 System.gc()。
加载更多回复(2)

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧