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

时间:2017-10-12 06:02:22

标签: java lotus-notes lotus-domino

 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?

2 个答案:

答案 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