gpt4 book ai didi

java - IBM Domino Java回收对象的正确方法

转载 作者:行者123 更新时间:2023-12-02 02:33:49 26 4
gpt4 key购买 nike

 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返回了对象,我什么时候需要回收?

最佳答案

没有。

显然 OrderRegels 超出了该方法的范围,我猜您正在 findRegels() 中执行某些操作来初始化它。我可能没有这样做,但没关系。但是,您不能在此方法内回收 OrderRegels,因为您要返回 orderRegelTemp,它是 OrderRegels 包含的子对象。当您回收 OrderRegles 时,它的所有子项都将被回收。因此,当方法的调用者尝试访问它时,您返回的对象将被回收。这将是一件非常糟糕的事情。

这只是第一个问题!

调用 getNextDocument 后,将 temp1 分配给 orderRegelTemp,然后循环,如果 if 条件满足,您要做的第一件事就是回收 temp1。由于 temp1 和 orderRegelTemp 引用同一个 Document 对象,因此您只是回收了方法尝试返回的 orderRegelTemp 的存储!因此,即使您删除了对 OrderRegels.recycle() 的调用,它仍然无法工作。

您正确执行的一件事是在 else 子句中调用 orderRegelTemp.recycle() 。这是正确的做法。如果您忽略了这一点,那么您将构建 Notes API 为这些文档分配的大量 C API 内存,并且很容易耗尽内存。即使在具有大量内存的 64 位系统上也是如此,因为 Notes API 管理共享内存段的方式。

关于java - IBM Domino Java回收对象的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46702465/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com