带有FTSearch内存泄漏的xPages

时间:2017-03-03 00:48:26

标签: javascript xpages lotus-domino

我的xPage有一个使用ARRAY作为数据源的重复控件。此数组从FTSearch获取值。问题是它使Domino服务器崩溃,因为OutOfMemory异常。

重播:

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

DATA SOURCE 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?

我无法弄清楚为什么Domino会失去记忆......(v9.0.1 FP6)

3 个答案:

答案 0 :(得分:1)

您可以对您的应用程序进行一些改进。没有具体的顺序:

  • 将您的逻辑移至JavaBean
  • 让bean缓存数组值,因此它只在应用程序生命周期中执行一次
    • 对包含所需列的视图使用FTSearch,因此您可以使用ViewEntries而不是文档
    • 仔细检查:如果退回的商品是日期时间,则需要回收
    • 增加服务器上的Java堆大小

答案 1 :(得分:1)

记忆和回收是不同的问题。 OutOfMemory是Java堆大小的问题,具有要序列化的Java对象所需的内存大小。 “PANIC:Lookup句柄超出范围”是回收问题的指标。

你正在为100个文档做一个FTSearch并得到四个值,所以除非那些是非常长的字符串,否则会引起内存问题似乎很奇怪。

检查持久性设置。 “将所有页面保留在内存中”将影响Java内存。此外,如果您在应用程序中有XAgent并且未设置viewState="nostate",那么这些也将保留在内存中并可能影响应用程序。用作REST服务的任何页面也会产生相同的影响。根据定义,XAgents和REST是无状态的,因此序列化它们毫无意义。

减少会话持续时间并使用Keep Session Alive控件也会使内存受益,因为浏览器关闭的会话的组件树将更快地被转储。默认情况下,它们不会在浏览器关闭后30分钟被转储。

所有这些都将记录在Mastering XPages第二版关于性能的章节中,同样也会记录在各种会话中有关XPage性能的幻灯片中。

答案 2 :(得分:1)

doc.getNextDocument(doc);更改为dc.getNextDocument(doc);