论坛首页 移动开发技术论坛

程序里到底需要不需要手动调用System.gc()

浏览 15491 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-08-05  
最近做的项目,同事喜欢在很多类里面加上一个release()之类的方法,并且在最后会调用一次System.gc(),说是这样可以有效的释放资源.在实际测试中,调用System.gc()的确可以回收一部分内存.但是,这个时候通常程序会明显感觉卡一下.到底应不应该手动调用System.gc()呢?我上网查了很多资料,其中一份是诺基亚论坛的<<Known Issues In The Nokia 6600 MIDP 2.0 Implementation>>,开头就是关于GC的:
Description:
Calling the System.gc() method results in extreme slowness and jamming. In Monty 1.0 VM, garbage collection is different and every time System.gc is called, the entire memory is really cleared. This is an extremely slow process!
Solution:
Do not call the System.gc method at all, or call the System.gc() garbage collecting method only in non-time-critical situations, such as screen transitions, state transitions, pause states, etc. If the System.gc() method is used, it is recommended to add a short delay (~20-50 ms) after the method call to ensure the sufficient time for the garbage collection, as in the following example:
System.gc();
Thread.sleep(delay); //delay = 20-50 ms

至少在6600的VM上,gc是会真的执行的,而不是"建议"执行.同事说这样至少可以防止OOME(OutOfMemoryException).其实经过实际测试,VM总是会在内存还剩10%~20%左右的时候调用自动GC,所以不会存在垃圾越堆越多.不过如果在内存资源紧缺的时候,加载大的资源还是会出现OOME.我的理解是:即时这个时候调用GC也无济于事.只能从根本上避免在内存到达峰值的时候加载大的资源.
另外,还有很多同事喜欢在一个对象不用的时候赋值null:
x=null;

据说这样是没有引用了,可以进行垃圾回收.我觉得如果是方法里面的对象属于年轻对象,VM是很快会知道该对象没有引用了的,不需要再手动赋值null,程序里到处是这样的语句,反而很丑陋.我反正从来没有因为忘记赋值null而导致程序崩溃过的,也没有因为赋值null而节约多少内存.
编码java时间不长,欢迎指正.
   发表时间:2009-08-06  
null值没必要,jvm自己清楚的很.
0 请登录后投票
   发表时间:2009-08-06  
TheMarine 写道
null值没必要,jvm自己清楚的很.


为什么没必要?你一个引用一直连着一个对象,kvm怎么知道你会不会再次使用这个对象。
0 请登录后投票
   发表时间:2009-08-06  
wayfarer 写道
TheMarine 写道
null值没必要,jvm自己清楚的很.


为什么没必要?你一个引用一直连着一个对象,kvm怎么知道你会不会再次使用这个对象。

如果一个方法里面的对象,就根本没有必要,如果是成员变量的话,你要换引用,直接赋另外一个就可以了,当然,你只是想置空一个的话,那也是可以显式的给null的
1 请登录后投票
   发表时间:2009-08-06  
java.lang.Object 写道
wayfarer 写道
TheMarine 写道
null值没必要,jvm自己清楚的很.


为什么没必要?你一个引用一直连着一个对象,kvm怎么知道你会不会再次使用这个对象。

如果一个方法里面的对象,就根本没有必要,如果是成员变量的话,你要换引用,直接赋另外一个就可以了,当然,你只是想置空一个的话,那也是可以显式的给null的


局部变量的生命周期就是方法的生命周期,方法结束了,局部变量自然就销毁了。如你所说,这个不用置null。
但是类变量还是需要置null的,因为这个类的对象本身是不会轻易销毁的。
0 请登录后投票
   发表时间:2009-08-07  
wayfarer 写道
java.lang.Object 写道
wayfarer 写道
TheMarine 写道
null值没必要,jvm自己清楚的很.


为什么没必要?你一个引用一直连着一个对象,kvm怎么知道你会不会再次使用这个对象。

如果一个方法里面的对象,就根本没有必要,如果是成员变量的话,你要换引用,直接赋另外一个就可以了,当然,你只是想置空一个的话,那也是可以显式的给null的


局部变量的生命周期就是方法的生命周期,方法结束了,局部变量自然就销毁了。如你所说,这个不用置null。
但是类变量还是需要置null的,因为这个类的对象本身是不会轻易销毁的。


当然,要制成NULL了,这样会加快KVM GC的效率。
0 请登录后投票
   发表时间:2009-08-07  
我觉得置为null唯一的好处是在用完这个变量的时候,防止别人再去使用
0 请登录后投票
   发表时间:2009-08-10  
softcat 写道
wayfarer 写道
java.lang.Object 写道
wayfarer 写道
TheMarine 写道
null值没必要,jvm自己清楚的很.


为什么没必要?你一个引用一直连着一个对象,kvm怎么知道你会不会再次使用这个对象。

如果一个方法里面的对象,就根本没有必要,如果是成员变量的话,你要换引用,直接赋另外一个就可以了,当然,你只是想置空一个的话,那也是可以显式的给null的


局部变量的生命周期就是方法的生命周期,方法结束了,局部变量自然就销毁了。如你所说,这个不用置null。
但是类变量还是需要置null的,因为这个类的对象本身是不会轻易销毁的。


当然,要制成NULL了,这样会加快KVM GC的效率。


赞成这一说法。
0 请登录后投票
   发表时间:2009-08-10  
除非系统安全性要求的高点,不然system.gc(),没必要我们coder新自去调用,不然和c++有怎么区别呢,至于将对象设为null看情况而定了,比较大的复杂的对象可以设为null,不过在方法里边好像没什么必要,一个方法执行over,对象变量的生命周性也就over了.
0 请登录后投票
   发表时间:2009-09-24  
如果一个对象不用,想GC回收到他。直接将其引用指向null就可以了。在程序中根本没必要去显式调用System.gc();只会浪费更多资源。而且他完全不符合PMD规范
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics