如果我有一个循环并在其中创建一个新对象
for ( int i ; i < 10 ; i++)
{
MyObject obj = new MuObject();
obj.use();
}
我是否需要在开头或结尾的循环内说obj = null以释放该对象使用的内存,或者使用“new”该对象将发送到GC?我可以在内存使用方面看到这个吗?
更新:所以如果我有大对象和长循环,我应该将对象分配为null还是不?
答案 0 :(得分:5)
请检查:http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html
“如果无法从任何活动线程或任何静态引用”访问,则对象可以符合垃圾收集或GC的条件。循环结束后,您在循环内创建的对象没有任何指向它们的外部引用,并且有资格进行垃圾回收。
修改强>
如果要查看内存使用情况,可以使用具有此类功能的IDE来分析应用程序。例如,NetBeans有一个很好的界面,可以显示对象分配的实时内存使用情况。
编辑2:
“所以,如果我有大对象和长循环,我应该将对象分配为null还是不?”
不,你不需要这样做。一旦循环的一次迭代完成,就没有对该迭代中创建的任何对象的活动引用,因此您有一个长循环或短循环并不重要。
答案 1 :(得分:1)
我是否需要在开头或结尾的循环内说obj = null以释放该对象使用的内存,或者使用“new”该对象将发送到GC?
也不是,真的。 new
仅构造新对象。当没有对象的引用时,例如超出范围(即,不在循环块中),它将有资格进行垃圾收集。请注意,Java的垃圾收集器不会立即收集对象 - 它会在感觉需要时批量执行。
我可以在内存使用方面看到这个吗?
我建议您查看VisualVM,包括您的JDK。它有一个内存视图,以及一个通过插件的垃圾收集器视图。
请注意,您不能依赖操作系统“正在使用”计数 - 如果没有任何主要集合,Java堆很少会收缩。
答案 2 :(得分:1)
不,你不需要将obj设置为null。当它被下一个循环迭代重新分配时,先前的引用将是垃圾(除非其他东西指向它)并且有资格进行清理。这就是自动垃圾收集的重点。
然而,当你需要注意控制内存的东西时,是。如果你有一个静态对象指针设置它可能永远不会被清理。 (它真的不是垃圾,因为它有实时参考)。一个常见的问题是缓存;它可能会保留那些永远无法清理的旧陈旧数据。
答案 3 :(得分:0)
即使您打电话给GC也不会立即这样做,但是为了实践,您可以这样做。 对于内存管理,您可以查看IDE的功能,如netbeans,Eclipse等。