2015-03-03 46 views
2

讀完我已經知道的許多博客和帖子後,我必須在我的課程和方法結束之前回收多米諾骨牌對象,以免超載我的堆。 但是惡魔在細節中,我忘記了多次回收一些物體,所以他們目前仍然活着在堆上。丟失它們之後回收多米諾骨牌物品

所以我的問題是,是否有可能從堆中收集和回收它們,而無需重新啓動服務器?

回答

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。有關於解決的問題以及如何解決的各種帖子。

這就是爲什麼我們沒有理由獲取有關回收利用的關注,除了在循環中,它不僅被回收重複對象是很重要的,也是任何DateTime是否或名稱是環內創建。

+0

小問題:他沒有說他在談論Java堆,而由recycle()恢復的C/C++內存實際上是在進程的整個堆空間中(無論是在本地堆空間還是共享記憶)。 – 2015-03-03 15:37:29

相關問題