在循环中定义java对象,我是否需要使用null来释放内存?

如果我有一个循环并在其中创建一个新对象

for ( int i ; i < 10 ; i++) { MyObject obj = new MuObject(); obj.use(); } 

我是否需要在开头或结尾的循环内说obj = null以释放该对象使用的内存,或者使用“new”该对象将发送到GC? 我可以在内存使用方面看到这个吗?

更新:所以如果我有大对象和长循环,我应该将对象分配为null或否?

检查一下: http : //javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html

“如果从任何活动线程或任何静态引用无法访问对象,则该对象符合垃圾收集或GC的条件” 。 循环结束后,您在循环内创建的对象没有任何指向它们的外部引用,并且有资格进行垃圾回收。

编辑:
如果要查看内存使用情况,可以使用具有此function的IDE来分析应用程序。 例如,NetBeans有一个很好的界面,可以显示对象分配的实时内存使用情况。

编辑2:
“所以如果我有大对象和长循环,我应该将对象分配为null还是不?”
不,你不需要这样做。 一旦循环的一次迭代完成,就没有对该迭代中创建的任何对象的活动引用,因此您有一个长循环或短循环并不重要。

我是否需要在开头或结尾的循环内说obj = null以释放该对象使用的内存,或者使用“new”该对象将发送到GC?

也不是,真的。 new只构造新对象。 当没有对象的引用时,例如超出范围(即,不在循环块中),它将有资格进行垃圾收集。 请注意,Java的垃圾收集器不会立即收集对象 – 它会在感觉需要时批量执行。

我可以在内存使用方面看到这个吗?

我建议看一下VisualVM,包括你的JDK。 它有一个内存视图,以及一个通过插件的垃圾收集器视图。

请注意,您不能依赖操作系统“正在使用”计数 – 如果没有任何主要集合,Java堆很少会收缩。

不,你不需要将obj设置为null。 当它被下一个循环迭代重新分配时,先前的引用将是垃圾(除非其他东西指向它)并且有资格进行清理。 这就是自动垃圾收集的重点。

但是在某些情况下,您必须注意控制内存的事情。 如果您设置了静态对象指针,则可能永远不会清除它。 (它真的不是垃圾,因为它有实时参考)。 一个常见问题是缓存; 它可能会保留从未被清理过的旧陈旧数据。

因为即使你打电话给GC也不会立即这样做,但是对于良好的练习你可以这样做。 对于内存管理,您可以查看IDE的function,如netbeans,Eclipse等。