我想确认哪个场景会导致对象myObj上的垃圾收集:
场景1
ArrayList arList = new ArrayList();
while(someCondition)
{
myObj = new MyObect(); // a custom object
arList.add(myObj);
}场景2
ArrayList arList = new ArrayList();
while(someCondition)
{
myObj = new MyObect(); // a custom object
arList.add(myObj);
myObj=null;
}显式地将对象设置为null是否会改善垃圾收集行为,还是在使用新构造函数重置对象时会是相同的?
发布于 2010-01-20 06:29:21
我认为这是你误解的根源。
嗯..。但我不希望保留两个myObj副本,一个在arList中,一个在原始变量中。一旦我将myObj添加到arLsit中,如何冲洗它?
你不能“保留两份myObj”。在您的示例中,循环创建的每个MyObject实例只有一个“副本”。顺序如下:
myObj。arList引用的arList。null分配给myObj中的引用。请注意,将引用添加到列表并不会创建MyObject实例的副本。它仅仅意味着你在两个地方而不是一个地方有引用。当您分配null时,您将再次将引用放在一个位置上。
另外要注意的是,将null分配给某物永远不会导致垃圾收集器运行。它所做的就是(显式地)在下次运行垃圾收集器时从考虑中删除引用的潜在副本。
最后,如果我们假设范围如下,则C行将没有明显的效果.除非A行或B行触发垃圾回收。
{
MyObject myObj;
ArrayList arList = new ArrayList();
while (someCondition) { // A
myObj = new MyObect(); // B
arList.add(myObj);
myObj = null; // C
}
}https://stackoverflow.com/questions/2099354
复制相似问题