丢失之后回收多米诺骨牌

时间:2015-03-03 08:29:24

标签: java xpages lotus-domino

在阅读了我已经知道的许多博客和帖子之后,我必须在我的课程和方法结束之前回收多米诺骨牌对象,以免重载我的堆。 但是魔鬼在细节上,我多次忘记回收一些物体,以便它们在堆上仍然活着。

所以我的问题是,是否可以从堆中收集和回收它们,而无需重新启动服务器?

1 个答案:

答案 0 :(得分:14)

几点:

  1. 回收Domino对象与重载堆无关。回收是因为Java与底层C ++ Domino对象之间的句柄映射。 Java变量通过正常的垃圾收集进行回收,因此无论您是否回收,Java堆都不受影响。剩下的是C ++对象的句柄,并且只有很多池。这就是为什么你得到的错误不是关于Java内存的错误,而是类似“PANIC:LookupHandle:处理超出范围”的原因。
  2. 指向同一底层对象的多个Java变量重用相同的句柄。这就是为什么如果你回收一个(句柄到一个)Domino对象但仍在其他地方使用那个Domino对象你会遇到问题的原因。
  3. 在每个XPage请求(页面加载,部分刷新等)结束时,会话,SessionAsSigner等被回收。回收过程也回收所有后代。因此,除非任何XPage卡在无限循环中,否则任何对象都无法在任何地方生存。
  4. 如上所述,回收对象会回收所有后代。但是像DateTimes和Names这样的对象是Session的子节点,而不是例如。 VIEWENTRY。关于已经解决的问题和如何解决的问题有各种各样的帖子。
  5. 这就是为什么没有理由关注循环,除了在循环中,重要的是不仅要回收被迭代的对象,还要回收在该循环中创建的任何DateTimes或Names。