精华帖 (0) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-05
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时间不长,欢迎指正. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-08-06
null值没必要,jvm自己清楚的很.
|
|
返回顶楼 | |
发表时间:2009-08-06
TheMarine 写道 null值没必要,jvm自己清楚的很.
为什么没必要?你一个引用一直连着一个对象,kvm怎么知道你会不会再次使用这个对象。 |
|
返回顶楼 | |
发表时间:2009-08-06
wayfarer 写道 TheMarine 写道 null值没必要,jvm自己清楚的很.
为什么没必要?你一个引用一直连着一个对象,kvm怎么知道你会不会再次使用这个对象。 如果一个方法里面的对象,就根本没有必要,如果是成员变量的话,你要换引用,直接赋另外一个就可以了,当然,你只是想置空一个的话,那也是可以显式的给null的 |
|
返回顶楼 | |
发表时间:2009-08-06
java.lang.Object 写道 wayfarer 写道 TheMarine 写道 null值没必要,jvm自己清楚的很.
为什么没必要?你一个引用一直连着一个对象,kvm怎么知道你会不会再次使用这个对象。 如果一个方法里面的对象,就根本没有必要,如果是成员变量的话,你要换引用,直接赋另外一个就可以了,当然,你只是想置空一个的话,那也是可以显式的给null的 局部变量的生命周期就是方法的生命周期,方法结束了,局部变量自然就销毁了。如你所说,这个不用置null。 但是类变量还是需要置null的,因为这个类的对象本身是不会轻易销毁的。 |
|
返回顶楼 | |
发表时间:2009-08-07
wayfarer 写道 java.lang.Object 写道 wayfarer 写道 TheMarine 写道 null值没必要,jvm自己清楚的很.
为什么没必要?你一个引用一直连着一个对象,kvm怎么知道你会不会再次使用这个对象。 如果一个方法里面的对象,就根本没有必要,如果是成员变量的话,你要换引用,直接赋另外一个就可以了,当然,你只是想置空一个的话,那也是可以显式的给null的 局部变量的生命周期就是方法的生命周期,方法结束了,局部变量自然就销毁了。如你所说,这个不用置null。 但是类变量还是需要置null的,因为这个类的对象本身是不会轻易销毁的。 当然,要制成NULL了,这样会加快KVM GC的效率。 |
|
返回顶楼 | |
发表时间:2009-08-07
我觉得置为null唯一的好处是在用完这个变量的时候,防止别人再去使用
|
|
返回顶楼 | |
发表时间:2009-08-10
softcat 写道 wayfarer 写道 java.lang.Object 写道 wayfarer 写道 TheMarine 写道 null值没必要,jvm自己清楚的很.
为什么没必要?你一个引用一直连着一个对象,kvm怎么知道你会不会再次使用这个对象。 如果一个方法里面的对象,就根本没有必要,如果是成员变量的话,你要换引用,直接赋另外一个就可以了,当然,你只是想置空一个的话,那也是可以显式的给null的 局部变量的生命周期就是方法的生命周期,方法结束了,局部变量自然就销毁了。如你所说,这个不用置null。 但是类变量还是需要置null的,因为这个类的对象本身是不会轻易销毁的。 当然,要制成NULL了,这样会加快KVM GC的效率。 赞成这一说法。 |
|
返回顶楼 | |
发表时间:2009-08-10
除非系统安全性要求的高点,不然system.gc(),没必要我们coder新自去调用,不然和c++有怎么区别呢,至于将对象设为null看情况而定了,比较大的复杂的对象可以设为null,不过在方法里边好像没什么必要,一个方法执行over,对象变量的生命周性也就over了.
|
|
返回顶楼 | |
发表时间:2009-09-24
如果一个对象不用,想GC回收到他。直接将其引用指向null就可以了。在程序中根本没必要去显式调用System.gc();只会浪费更多资源。而且他完全不符合PMD规范
|
|
返回顶楼 | |