什么样的对象和变量才能被回收 已经可以回收了 回收不回收由JVM的策略决定。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 已经可以回收了 实际什么时候回收由JVM的策略决定。 是不是所有不为null的对象最后都成为不能被回收的垃圾?如果是那样不是要把所有对象都设为NULL,才行。 当对象的引用不再存在的时候,对象将被回收。把对象设置为NULL并不能促使对象被回收,因为对象的引用仍然存在,虽然它指向的是NULL。JAVA的垃圾回收机制几乎不用我们去理会的。当对象的生命周期终结的时候,其引用将不再存在,对象也将被回收。 请弄清楚对象引用和对象本身的区别。只有对象本身才有垃圾收集一说,条件是所有指向这个对象的引用变量统统消失或者不再指向它。对象引用变量没有垃圾收集的概念。对于局部变量,一脱离作用域它就立马消失。一个局部变量的值不管是什么--是null,还是指向某个对象--只要他脱离作用域,它就消失。 回复人: chenxuwen(小白) ( ) 信誉:100 2004-04-20 18:21:00 得分:0 当对象的引用不再存在的时候,对象将被回收。把对象设置为NULL并不能促使对象被回收,因为对象的引用仍然存在,虽然它指向的是NULL。JAVA的垃圾回收机制几乎不用我们去理会的。当对象的生命周期终结的时候,其引用将不再存在,对象也将被回收。 =============================错误, 把对象设置为NULL , 则对象可以被收集,实际什么时候收集要根据JVM策略。 java虚拟机可以决定是否被回收 public Object function1(){Object a=new Object();return a;}public void main(){Object a=function1();}如果一脱离作用域它就立马消失,那Object a=function1();就不能得到引用了。 to bs221cn:Object a= functionl();实际上是创建了这个实例,因此并没有脱离作用域 java虚拟机决定是否回收一般是系统内存即将用完,而且变量不在使用时 回复人: bs221cn() ( ) 信誉:100 2004-04-21 09:01:00 得分:0 public Object function1(){Object a=new Object();return a;}public void main(){Object a=function1();}如果一脱离作用域它就立马消失,那Object a=function1();就不能得到引用了。 ======================================你的方法main有错误,编译不能通过,你一定要这样写public static void main() 小错误而已,呵呵呵呵 to : game0ver12345(sfsfdsfdsdfsf)你错了吧?改成public static void main()才会‘编译不能通过’ 回复人: bs221cn() ( ) 信誉:100 2004-04-22 11:16:00 得分:0 to : game0ver12345(sfsfdsfdsdfsf)你错了吧?改成public static void main()才会‘编译不能通过’ ==============================你说对了,是我错了。靠,犯了低级错误,没脸。 to bs221cn() -----------------------------public Object function1(){Object a=new Object();return a;}public void main(){Object a=function1();}如果一脱离作用域它就立马消失,那Object a=function1();就不能得到引用了。--------------------------------------怎么不能得到引用?引用(句柄,handle)的传递是传值的,是复制的。方法内的a作为局部变量是消失了,但是在main里面你不是声明了新的引用Object a吗?其实关键还是要搞清楚引用和对象是两码事。引用遵循作用域的规则,而作用域的检查是编译期决定的;对象的回收由垃圾收集机制负责,那是运行期的概念。 给对象赋予了空值null,以下再没有调用过。 2.给对象赋予了新值,既重新分配了内存空间。程序段1: 1.fobj = new Object ( ) ; 2.fobj. Method ( ) ; 3.fobj = new Object ( ) ; 4.fobj. Method ( ) ; 问:这段代码中,第几行的fobj 符合垃圾收集器的收集标准? 答:第1行。因为第3行的fobj被赋了新值,产生了一个新的对象,即换了一块新的内存空间,也相当于为第1行中的fobj赋了null值。这种类型的题在认证0考试中是最简单的。 程序段2: 1.Object sobj = new Object ( ) ; 2.Object sobj = null ; 3.Object sobj = new Object ( ) ; 4.sobj = new Object ( ) ; 问:这段代码中,第几行的内存空间符合垃圾收集器的收集标准? 答:第1行和第3行。因为第2行为sobj赋值为null,所以在此第1行的sobj符合垃圾收集器的收集标准。而第4行相当于为sobj赋值为null,所以在此第3行的sobj也符合垃圾收集器的收集标准。 如果有一个对象的句柄a,且你把a作为某个构造器的参数,即 new Constructor ( a )的时候,即使你给a赋值为null,a也不符合垃圾收集器的收集标准。直到由上面构造器构造的新对象被赋空值时,a才可以被垃圾收集器收集。总之,在Java语言中,判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个: 1.给对象赋予了空值null,以下再没有调用过。 2.给对象赋予了新值,既重新分配了内存空间。 不用设置为null,也不是设置为null了马上就会被回收jvm每隔一段时间会启动gc收集无用对象,还有就是内存即将分配完毕后也会启动对大多数新手这种问题不用去刻意留意,java不要求也不希望用户管理内存 http://expert.csdn.net/Expert/topic/2868/2868335.xml?temp=.9057581 http://expert.csdn.net/Expert/topic/3014/3014179.xml?temp=.6822168 fckeditor编辑器问题 【关于Spring @RequestMapping的问题】 【think in java】 struts2的addFieldError 工具类spring管理session 怎么删除? 求,一个时间分隔的有趣的问题? java做推送的问题 急啊!help 菜鸟问题:Xerces这dd怎么用啊? Maven 集成Tomcat7插件启动不了 写了个简单CMP Entity Bean,在运行是报错,请帮忙 我用J2SDKEE1.3.1部署,浏览器提示的错误?
如果是那样不是要把所有对象都设为NULL,才行。
把对象设置为NULL并不能促使对象被回收,因为对象的引用仍然存在,虽然它指向的是NULL。
JAVA的垃圾回收机制几乎不用我们去理会的。当对象的生命周期终结的时候,其引用将不再存在,对象也将被回收。
只有对象本身才有垃圾收集一说,条件是所有指向这个对象的引用变量统统消失或者不再指向它。对象引用变量没有垃圾收集的概念。对于局部变量,一脱离作用域它就立马消失。一个局部变量的值不管是什么--是null,还是指向某个对象--只要他脱离作用域,它就消失。
当对象的引用不再存在的时候,对象将被回收。
把对象设置为NULL并不能促使对象被回收,因为对象的引用仍然存在,虽然它指向的是NULL。
JAVA的垃圾回收机制几乎不用我们去理会的。当对象的生命周期终结的时候,其引用将不再存在,对象也将被回收。
=============================错误, 把对象设置为NULL , 则对象可以被收集,实际什么时候收集要根据JVM策略。
{
Object a=new Object();
return a;}
public void main()
{
Object a=function1();
}
如果一脱离作用域它就立马消失,那Object a=function1();就不能得到引用了。
Object a= functionl();
实际上是创建了这个实例,因此并没有脱离作用域
一般是系统内存即将用完,而且变量不在使用时
public Object function1()
{
Object a=new Object();
return a;}
public void main()
{
Object a=function1();
}
如果一脱离作用域它就立马消失,那Object a=function1();就不能得到引用了。
======================================你的方法main有错误,编译不能通过,你一定要这样写public static void main()
小错误而已,呵呵呵呵
to : game0ver12345(sfsfdsfdsdfsf)你错了吧?改成public static void main()才会‘编译不能通过’
==============================你说对了,是我错了。靠,犯了低级错误,没脸。
-----------------------------
public Object function1()
{
Object a=new Object();
return a;}
public void main()
{
Object a=function1();
}
如果一脱离作用域它就立马消失,那Object a=function1();就不能得到引用了。
--------------------------------------怎么不能得到引用?引用(句柄,handle)的传递是传值的,是复制的。方法内的a作为局部变量是消失了,但是在main里面你不是声明了新的引用Object a吗?
其实关键还是要搞清楚引用和对象是两码事。引用遵循作用域的规则,而作用域的检查是编译期决定的;对象的回收由垃圾收集机制负责,那是运行期的概念。
程序段1:
1.fobj = new Object ( ) ;
2.fobj. Method ( ) ;
3.fobj = new Object ( ) ;
4.fobj. Method ( ) ;
问:这段代码中,第几行的fobj 符合垃圾收集器的收集标准?
答:第1行。因为第3行的fobj被赋了新值,产生了一个新的对象,即换了一块新的内存空间,也相当于为第1行中的fobj赋了null值。这种类型的题在认证0考试中是最简单的。
程序段2:
1.Object sobj = new Object ( ) ; 2.Object sobj = null ; 3.Object sobj = new Object ( ) ; 4.sobj = new Object ( ) ;
问:这段代码中,第几行的内存空间符合垃圾收集器的收集标准?
答:第1行和第3行。因为第2行为sobj赋值为null,所以在此第1行的sobj符合垃圾收集器的收集标准。而第4行相当于为sobj赋值为null,所以在此第3行的sobj也符合垃圾收集器的收集标准。
如果有一个对象的句柄a,且你把a作为某个构造器的参数,即 new Constructor ( a )的时候,即使你给a赋值为null,a也不符合垃圾收集器的收集标准。直到由上面构造器构造的新对象被赋空值时,a才可以被垃圾收集器收集。
总之,在Java语言中,判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个:
1.给对象赋予了空值null,以下再没有调用过。 2.给对象赋予了新值,既重新分配了内存空间。
jvm每隔一段时间会启动gc收集无用对象,还有就是内存即将分配完毕后也会启动
对大多数新手这种问题不用去刻意留意,java不要求也不希望用户管理内存