我的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)
答案 0 :(得分:1)
您可以对您的应用程序进行一些改进。没有具体的顺序:
答案 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);