2017-03-03 49 views
0

我的xPage有一個使用ARRAY作爲數據源的重複控件。該數組從FTSearch獲取值。問題是,它使Domino服務器崩潰,因爲OutOfMemory異常。帶有FTSearch內存泄漏的xPages

REPEAT:

<xp:repeat id="ssRepeat" var="rData" indexVar="rIndex" value="#{javascript:getMyDocs()}"> 

數據來源SSJS:

function getMyDocs(){ 
    ............. 

    var myArr = new Array(); 

    var dc:NotesDocumentCollection = db.FTSearch(<......>, 100); 

    var doc:NotesDocument = dc.getFirstDocument(); 
    var tmpdoc:NotesDocument = null; 


    while (doc != null) { 
     var xx = doc.getItemValueString("xx"); 
     var yy = doc.getItemValueString("yy"); 
     var zz = doc.getItemValueString("zz"); 
     var ww = doc.getItemValueString("ww"); 

     myArr.push([xx, yy, zz, ww, vv]); 

     tmpdoc = dc.getNextDocument(doc); 
     doc.recycle(); 
     doc = tmpdoc; 

    } 
    ............. 

    dc.recycle();  
    return myArr; 
} 

你看到什麼錯在我的代碼?這是一個正確的方法嗎?

Note: 
1. There can be multiple repeats on the page that use getMyDocs() function to find documents (based on search parameters). 
2. FT index is really huge ~1Gb because the db is ~50Gb. 
3. Do I recycle() everything right? 

我想不通爲什麼多米諾失去它的內存...(v9.0.1 FP6)

回答

1

有許多改進,你可以讓你的應用程序。在沒有特定的順序:

  • 你的邏輯在應用程序生命週期
    • 使用FTSearch移動到一個JavaBean
    • 讓Bean緩存數組值,所以只執行一次,對具有一個視圖你需要的列,這樣你就可以
    • 仔細檢查使用ViewEntries而不是文件:如果返回的項目是需要回收太
    • 增加服務器上的Java堆大小日期時間
+0

謝謝stwissel。那麼,如果xx,yy ..等中的一個是Datetime,那麼我在上面的示例中將在哪裏回收它?我不希望將NULL值置於myArray中,該函數返回 – VladP

1

內存和回收是不同的問題。 OutOfMemory是Java堆大小的一個問題,具有要序列化的Java對象所需的內存大小。 「PANIC:查找處理超出範圍」是回收問題的指標。

您正在爲100個文檔執行FTSearch並獲取四個值,因此除非這些字符串非常長,否則似乎很奇怪會導致內存問題。

檢查持久性設置。 「將所有頁面保留在內存中」將會影響Java內存。此外,如果您的應用程序中有XAgent,並且未設置viewState="nostate",則這些也將保留在內存中,並可能影響應用程序。任何用作REST服務的頁面也會產生相同的影響。 XAgents和REST根據定義是無狀態的,所以序列化它們是毫無意義的。

減少會話持續的時間長度並使用Keep Session Alive控件也會使內存受益,因爲瀏覽器關閉的會話的組件樹將更快地被轉儲。默認情況下,瀏覽器關閉後30分鐘內不會被拋棄。

所有這些將記錄在Mastering XPages第二版關於性能的章節中,以及來自各個會話的有關XPage性能的幻燈片中。

+0

當Domino的共享內存分配和本地進程堆棧和堆內存耗盡服務器的虛擬地址空間時,也不會拋出OutOfMemory,以便JVM嘗試分配頁面時對於堆,即使它在配置的JavaMaxHeapSize中,它也會失敗? (現在在64位操作系統上可能不是問題,但上次我記得研究它時,其中一位工程師告訴我,是的,Domino是64位的,但沒有充分利用它。) –

+0

我們的Domino管理員照顧了JavaMaxHeapSize ..似乎它有幫助。但我會再看幾天的Domino日誌....對不起,但我在哪裏設置viewState =「nostate」? – VladP

+0

在XPage中的「所有屬性」選項卡上。這是XPage本身的一個屬性,因此您需要在Outline中選擇它或者沒有選擇組件。 –

1

變化doc.getNextDocument(doc);dc.getNextDocument(doc);

+0

這只是我的例子中的錯字。 – VladP