2017-10-12 80 views
0
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是否返回對象?IBM的Domino的Java回收的方法正確對象

回答

2

顯然OrderRegels是這種方法的範圍之內,我想你是在做findRegels)東西(初始化它。我可能沒有這樣做,但沒關係。但是,您不能因爲您正在返回OrderRegelTemp(它是OrderRegels包含的子對象),因此需要在此方法內回收OrderRegels。當您回收OrderRegles時,其所有子女都將被回收。因此,您返回的對象在您的方法的調用者嘗試訪問它時將被回收。這將是一件非常糟糕的事情。

而這只是第一個問題!

在您調用getNextDocument之後,您將temp1指定給orderRegelTemp,然後循環,如果條件成立,您要做的第一件事就是回收temp1。由於temp1和orderRegelTemp引用同一個Document對象,因此您只是爲您的方法試圖返回的orderRegelTemp回收存儲空間!所以,即使你刪除了對OrderRegels.recycle()的調用,它仍然不起作用。

你正在做的一件事是在你的else子句中調用orderRegelTemp.recycle()。這是正確的做法。如果您忽略了這一點,那麼您將構建Notes API爲這些文檔分配的大量C API內存,並且您可能會輕鬆地耗盡內存。由於Notes API管理共享內存段的方式,即使在具有大量內存的64位系統上,情況依然如此。

0

關於回收的Domino做了三件事自動(據我所知):

  • 當代理結束它回收會議
  • 當一個對象被回收它回收所有兒童( - >當代理結束其所有對象得到回收 - 一般)
  • 當一個線程結束它回收此線程被打開了,如果他們不被其他線程感動了所有的數據庫(使用同一個會話)

多米諾骨牌的自動回收對您無能爲力(事實上它經常會讓事情變得更糟)。
但是,您可以使用回收站自動回收:http://recycler.sourceforge.io