丢失后回收多米诺骨牌对象
recycle domino objects after they are lost
阅读许多我已经知道的博客和帖子后,我必须在 class 和方法结束之前回收 domino 对象,以免堆过载。
但是细节决定成败,我忘记回收一些对象很多次了,所以它们在堆上还活着。
所以我的问题是,是否可以在不重启服务器的情况下从堆中收集和回收它们?
几点:
- 回收 Domino 对象与堆超载无关。回收是因为 Java 到底层 C++ Domino 对象之间的句柄映射。 Java 变量通过正常的垃圾收集回收,因此 Java 堆不受影响,无论您是否回收。剩下的是 C++ 对象的句柄,并且只有这么多。这就是为什么您得到的错误不是关于 Java 内存的错误,而是 "PANIC: LookupHandle: handle out of range".
之类的错误
- 多个 Java 变量指向相同的底层对象,重复使用相同的句柄。这就是为什么如果您回收一个(到一个)Domino 对象但仍在别处使用该 Domino 对象,您可能会遇到问题。
- 在每个 XPages 请求(页面加载、部分刷新等)结束时,Session、SessionAsSigner 等被回收。回收过程也回收所有后代。因此,除非任何 XPage 卡在无限循环中,否则任何地方都不可能有任何对象仍然存在。
- 如前所述,回收对象会回收所有后代。但是像 DateTimes 和 Names 这样的对象是 Session 的子对象,而不是例如查看条目。关于我所涉及的问题以及如何解决的帖子有很多。
这就是为什么除了在循环中没有理由担心回收,在循环中不仅回收被迭代的对象很重要,而且回收在该循环中创建的任何日期时间或名称也很重要。
阅读许多我已经知道的博客和帖子后,我必须在 class 和方法结束之前回收 domino 对象,以免堆过载。 但是细节决定成败,我忘记回收一些对象很多次了,所以它们在堆上还活着。
所以我的问题是,是否可以在不重启服务器的情况下从堆中收集和回收它们?
几点:
- 回收 Domino 对象与堆超载无关。回收是因为 Java 到底层 C++ Domino 对象之间的句柄映射。 Java 变量通过正常的垃圾收集回收,因此 Java 堆不受影响,无论您是否回收。剩下的是 C++ 对象的句柄,并且只有这么多。这就是为什么您得到的错误不是关于 Java 内存的错误,而是 "PANIC: LookupHandle: handle out of range". 之类的错误
- 多个 Java 变量指向相同的底层对象,重复使用相同的句柄。这就是为什么如果您回收一个(到一个)Domino 对象但仍在别处使用该 Domino 对象,您可能会遇到问题。
- 在每个 XPages 请求(页面加载、部分刷新等)结束时,Session、SessionAsSigner 等被回收。回收过程也回收所有后代。因此,除非任何 XPage 卡在无限循环中,否则任何地方都不可能有任何对象仍然存在。
- 如前所述,回收对象会回收所有后代。但是像 DateTimes 和 Names 这样的对象是 Session 的子对象,而不是例如查看条目。关于我所涉及的问题以及如何解决的帖子有很多。
这就是为什么除了在循环中没有理由担心回收,在循环中不仅回收被迭代的对象很重要,而且回收在该循环中创建的任何日期时间或名称也很重要。