2014-01-23 31 views
0

我有需求的知識基礎分區在每個用戶的基礎上。所有的會話都需要在內存中。在第一階段,我已經測試了2000會話,考慮到每個會話中的5條規則,它佔用了將近750MB的堆內存。有人可以告訴我如何確定每個會話的大小和減少內存消耗,因爲我需要將應用程序擴展到10000個用戶內存採取由drools Knowkedge會話

回答

1

您只需要運行具有不同併發會話數的應用程序,繪製會話圖與堆大小和外推。沒有特別的醬,我可以想到特別與Drools有關。

這個關鍵是每個會話中的事實數量和規則中的連接數量。你應該閱讀說明書上的「跨產品」這一節中,這也解釋瞭如何減少加入:

http://docs.jboss.org/drools/release/5.5.0.Final/drools-expert-docs/html_single/#d0e941

此外,兩個問題,你應該考慮:

  1. 是否有其中的方法你可以重構使用無狀態會話?
  2. 有沒有一種方法可以讓一個會話滿足所有用戶的需求?

除非您在每個用戶會話開始時插入大量事實,或者您的應用程序正在使用Fusion進行某種流式事件處理,那麼您應該可以切換到無狀態會話,而不會有任何嚴重性能影響。

0

它不顯示內存使用情況,但這可以幫助您瞭解當前運行時的所有規則和事實。

知道規則:

ksession2.getKnowledgeBase().getKnowledgePackages().each { 
      it.rules.each { log.debug "- rules are:"+it.name } 
     } 

的事實:

for (Object fact : ksession2.getObjects()) { 
      sb2z.append (" Fact: " + fact.class.name); 
     } 

我用上面的腳本的方式來獲得運行時對象的信息,並使用一些JVM可視知道它們的大小。