public lotus.domino.Document getParentItemFromServiceOrder() throws NotesException{
findRegels();
lotus.domino.Document orderRegelTemp = OrderRegels.getFirstDocument();
lotus.domino.Document temp1 = null;
while(orderRegelTemp != null)
{
if(orderRegelTemp.getItemValueString("PARENTLINEITEM").equals("1"))
{
if(temp1 != null) temp1.recycle();
if(OrderRegels != null)OrderRegels.recycle();
return orderRegelTemp;
}
else{
temp1 = OrderRegels.getNextDocument(orderRegelTemp);
orderRegelTemp.recycle(); // recycle the one we're done with
orderRegelTemp = temp1;
}
}//end while
if(orderRegelTemp != null) orderRegelTemp.recycle();
if(temp1 != null) temp1.recycle();
if(OrderRegels != null)OrderRegels.recycle();
return null;
}
我想知道上述方法中的回收是否需要,或者在执行该功能时是否会自动回收对象..接下来,如果它返回了对象,我什么时候需要回收orderRegelTemp?
答案 0 :(得分:2)
没有。
显然OrderRegels超出了这个方法的范围,我猜你在findRegels()中做了一些事情来初始化它。我可能没有这么做,但没关系。但是,无法在此方法中回收OrderRegels,因为您要返回orderRegelTemp,它是OrderRegels包含的子对象。当您回收OrderRegles时,它的所有子项都将被回收。因此,当您的方法的调用者尝试访问它时,您返回的对象将被回收。这将是一个非常糟糕的事情。
这只是第一个问题!
在调用getNextDocument之后,将temp1分配给orderRegelTemp,然后循环,如果if条件命中,则首先要做的是回收temp1。由于temp1和orderRegelTemp引用相同的Document对象,因此您只需为您的方法尝试返回的orderRegelTemp回收存储空间!因此,即使您删除了对OrderRegels.recycle()的调用,它仍然无法正常工作。
你正确做的一件事就是在你的else子句中调用orderRegelTemp.recycle()。这是正确的做法。如果您省略了它,那么您将构建许多Notes API为这些文档分配的C API内存,并且您可能很容易耗尽内存。由于Notes API管理共享内存段的方式,即使在具有大量内存的64位系统上也是如此。
答案 1 :(得分:0)
关于回收Domino自动完成三件事(AFAIK):
多米诺的自动回收对您没有多大帮助(事实上它往往会让事情变得更糟) 但您可以使用回收商自动化回收:http://recycler.sourceforge.io