2017-01-09 37 views
1

我上運行TomEE(樣的Tomcat)Java服務器8和使用泰坦1.0.0與卡桑德拉後端和Elasticsearch指數作爲我的數據庫。在我用小用戶連接的開發環境中,一切都很完美,但是在我的生產服務器上,許多用戶連接了很多數據庫訪問權限,我們有一個內存泄漏問題,可能是因爲Titan圖形緩存或Titan相對。我配置了4GB堆大小,並且在堆上運行超過10小時的分配內存增長到其最大值(〜300Mb每小時)之後,它導致GC(垃圾收集器)無法再清理並繼續運行導致服務器實例無響應。 使用VisualVM的我做了一些內存分析,而這些都是我的截圖: Allocated memory graph
Heap histogram 任何建議,我們如何解決這個或找到更詳細調查這個問題的方法是什麼?在這種情況下,可能有些GC參數可以幫助我們?泰坦1.0.0圖形緩存內存泄漏

回答

2

我曾在Cassandra的Titan 1.0中看到過這些問題。兩件事情來檢查:

打開和關閉圖形

你給每個用戶或每個用戶不同的圖表圖打開不同的事務?即你在幹什麼:

(1)

//User 1 Logs in 
graph = TitanFactory.open(config); 
soStuffWithGraph(graph); 
//User 2 Logs in 
graph = TitanFactory.open(config); 
soStuffWithGraph(graph); 

(2)

graph = TitanFactory.open(config); 
//User 1 Logs in 
soStuffWithGraph(graph); 
//User 2 Logs in 
soStuffWithGraph(graph); 

方法(1)意味着每個用戶得到自己的連接與圖他們自己的圖形對象。這非常沉重並導致更多的內存使用。

方法(2)意味着每個用戶使用相同的連接但不同的事務。這在我看來是可取的。 注意:這是假設用戶處於不同的線程。

長期生活事務

這是我有問題,這導致類似的GC問題給自己。我只是把交易存活了很長時間。爲了加速查詢Titan緩存,我認爲除非事務關閉,否則它不會清除緩存。所以理想情況下,您應該有這樣的東西:

graph = TitanFactory.open(config); 
//User 1 Logs in 
soStuffWithGraph(graph); 
graph.tx().close(); 
//User 2 Logs in 
soStuffWithGraph(graph); 
graph.tx().close(); 

其中每個事務在用戶完成後關閉。

+0

我正在使用第二種方法。我有一個打開的圖形連接,並打開每個用戶請求的新事務'TitanTransaction tt = graph.newTransaction()'。每個事務都很短(添加或更新一個或兩個頂點或邊或者從頂點查詢數據),並且在事務失敗的情況下,事務始終提交'tt.commit()'或回滾'tt.rollback()' (在拋出一些異常之前) – OctopusSD

+0

你使用'graph.newTransaction()'然後你正在創建[多線程事務](http://s3.thinkaurelius.com/docs/titan/1.0.0/tx.html#多線程-tx),它創建了一個全新的事務處理對象,這個對象也很重並且總是打開。如果你*明確地*爲每個用戶創建一個,那麼你應該在最後調用'tt.close()'。否則它將保持開放。 –

+1

從Titan [文檔](http://s3.thinkaurelius.com/docs/titan/1.0.0/index.html)和[javadoc](http://titan.thinkaurelius.com/javadoc/1.0.0/) )我認爲''tt.commit()'和'tt.rollback()'會在每次提交旁邊添加'tt.close()'後關閉事務BUT並回滾它以解決我們的內存泄漏問題。 – OctopusSD