2011-03-23 102 views
0

我要存儲在JRuby中物體的時間很短。對象使用特效,所以我似乎有麻煩存儲到數據庫。如果任何人對如何堅持jruby物體持續1-5分鐘有很好的想法,那就太好了。JRuby的持久性問題

這些對象是相當大的,特別是,當機立斷瀏覽器對象。

現在,我已經創建了一個模型,在JRuby中,像這樣:

class Persist 
    @@persistHash ||= Hash.new 

    def self.storeItem(id, item) 
     @@persistHash[id.to_s] = item 
    end 

    def self.getItem(id) 
     return @@persistHash[id.to_s] 
    end 
end 

我已經啁啾的應用程序,並部署它GlassFish v2中。

我運行程序,它一會兒工作正常。但一天之後,如果我叫「商店」(10-20秒)我回到零右後「得到」。

我無法找到日誌中的任何錯誤。

編輯:我還發現,該項目確實插入到哈希表(插入在哈希表沒用完的內存):

前24小時:

Persist.storeItem(),其次通過Persist.getItem()工作正常。

一個HTTP調用的存儲。然後另一個http調用get返回對象。

24小時後:

Persist.storeItem(),其次是Persist.getItem()工作正常。

一個HTTP調用的存儲。然後另一個http調用get返回nil。

+0

我不知道如果你堅持的實例(S)是在被在離開該範圍內摧毀了當地的範圍。你看過嗎? – 2011-03-23 23:00:35

+0

我不知道如何正確實例。我假設商店和獲取是靜態類方法,我只是從不同的模型或控制器調用Persist.storeItem。即使Persist課程一直在重新加載,我不明白爲什麼它會在一天內正常工作。 – Andy 2011-03-24 02:51:45

+0

你說得對 - 我沒有注意到他們是類的方法,即使我注意到了@@。我的下一個想法是,它一直在重新加載,但考慮到它可以工作一天,我感到困惑。您是否在23:59和24:01小時測試過它(例如,您確定它是在24小時標記處,或者它可能在0:00重置?) – 2011-03-24 12:06:56

回答

1

我不看對象在任何時候被刪除。

我會使用其他工具檢查JVM。這可能是你已經耗盡內存,但是日誌消息/異常永遠不會被創建來報告內存耗盡。

我可以建議掛鉤的各種堆地區的JMX監控,並創建通過哈希可以清除舊物的手段。

希望我對你有更多。祝你好運!

+0

它似乎可以正確添加到散列表中。我將檢查JMX監視器。我想知道是否有人有更好的方法來堅持具有特效的大型jruby對象?那裏有沒有很酷的序列化寶石? – Andy 2011-03-24 03:00:07

+0

確實存在內存泄漏。奇怪的是,沒有任何資料顯示在任何日誌中,並且它能夠在集合之後工作。我發送了jmap live:histo | grep'jruby'並最終找到了我正在尋找的^^。 – Andy 2011-03-30 19:33:18