2016-04-21 18 views
1

我目前正在優化代碼,定期從數據庫重新加載大量數據。每次執行此操作〜操作結束後,會創建並釋放800k個對象以進行垃圾回收。如何僅將disruptor庫用作對象池?

作爲代碼的一個優化,我想使用一個對象池來重新使用池中的對象,並且對垃圾回收的影響有點小。我考慮過使用干擾庫來達到這個目的,但遺憾的是,我找不到任何最近的例子來處理借用和回饋對象到池中。大多數例子都集中在消息處理上。

現在我的問題是,如果有任何示例項目/代碼僅用於處理池或者如果有人能夠提供想法如何解決這個干擾。

UPDATE 我發現this GitHub庫基本上實現在背景使用破碎一個池解決方案。

回答

0

對象池概念用於可以借用對象的位置(即調用borrow()),並且您應該返回對象(即調用returnObject()方法)到池 否則對象池將失敗。 如果您可以在不需要對象時再次將該對象返回到池中,請嘗試使用該對象。這將有很大幫助。

0

我並不完全確定它確實會干擾您的需求。以非常簡化的方式

干擾器是一種讓生產者和消費者溝通的方式 無鎖和高效的內存處理。

更多詳細信息解答(here)爲您提供了關於干擾器實現的內部工作原理的完整說明。

你彷彿在此基礎上問題陳述是這樣做:

...優化重新加載從 數據庫定期龐大的數據量的代碼。每當這個操作執行〜創建和發佈進行垃圾回收800K 對象...

爲此,我只會用簡單的緩存機制。如果您只加載一次數據,然後不斷爲您的流程提供每次需要的訪問權限,那麼您的GC加載將會盡可能優化。關於其他問題:

  • 數據過時
  • 存儲器消耗
  • 讀寫並行

適當緩存參數化可以被用於解決這些問題(evictation,預讀刷新,通讀行爲等)。

+0

問題是,聲明的對象當前僅用作臨時對象,並立即轉移到某種不同的表示形式。後面的部分被緩存直到下一次重新加載。我同意,整個情況並不理想,但由於幾個原因,我現在不能改變一般的處理方式,只關心臨時對象。 – u6f6o