首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 系统运维 >

程序里究竟需要不需要手动调用System.gc()

2012-09-15 
程序里到底需要不需要手动调用System.gc()最近做的项目,同事喜欢在很多类里面加上一个release()之类的方法

程序里到底需要不需要手动调用System.gc()
最近做的项目,同事喜欢在很多类里面加上一个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时间不长,欢迎指正. 15 楼 flyingghost 2010-03-24   鸟哥说的很到位。
gc原理大家都明白,完全是java描述的那样。
但实际编程中要不要调,什么时候调,取决于程序需求和虚拟机本身实现。
有的机器一次gc调用硬生生对应一次gc过程,完全没有所谓的消息通知。这时候调用越多机器越卡。
也有的机器自动gc性能非常差,以至于不依赖手动gc调用,内存基本得不到回收。

热点排行