我上運行TomEE(樣的Tomcat)Java服務器8和使用泰坦1.0.0與卡桑德拉後端和Elasticsearch指數作爲我的數據庫。在我用小用戶連接的開發環境中,一切都很完美,但是在我的生產服務器上,許多用戶連接了很多數據庫訪問權限,我們有一個內存泄漏問題,可能是因爲Titan圖形緩存或Titan相對。我配置了4GB堆大小,並且在堆上運行超過10小時的分配內存增長到其最大值(〜300Mb每小時)之後,它導致GC(垃圾收集器)無法再清理並繼續運行導致服務器實例無響應。 使用VisualVM的我做了一些內存分析,而這些都是我的截圖:
任何建議,我們如何解決這個或找到更詳細調查這個問題的方法是什麼?在這種情況下,可能有些GC參數可以幫助我們?泰坦1.0.0圖形緩存內存泄漏
1
A
回答
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();
其中每個事務在用戶完成後關閉。
相關問題
- 1. iPhone:UITableView泄漏像泰坦尼克號!
- 2. 番石榴緩存內存泄漏
- 3. 核心圖形內存泄漏
- 4. 內存泄漏
- 5. 內存泄漏:
- 6. 內存泄漏
- 7. 內存泄漏
- 8. 內存泄漏
- 9. 內存泄漏
- 10. 內存泄漏
- 11. 內存泄漏
- 12. 內存泄漏
- 13. 內存泄漏
- 14. 內存泄漏:
- 15. 內存泄漏
- 16. 內存泄漏
- 17. 內存泄漏
- 18. 內存泄漏
- 19. 內存泄漏
- 20. 內存泄漏
- 21. 內存泄漏
- 22. 內存泄漏從位圖
- 23. 位圖內存泄漏 - Android
- 24. 位圖內存泄漏?
- 25. Android內存泄漏位圖
- 26. 位圖內存泄漏
- 27. Autoreleasepool內存泄漏?
- 28. NSExpression內存泄漏?
- 29. BeginInvoke內存泄漏?
- 30. 內存泄漏 - g_strndup
我正在使用第二種方法。我有一個打開的圖形連接,並打開每個用戶請求的新事務'TitanTransaction tt = graph.newTransaction()'。每個事務都很短(添加或更新一個或兩個頂點或邊或者從頂點查詢數據),並且在事務失敗的情況下,事務始終提交'tt.commit()'或回滾'tt.rollback()' (在拋出一些異常之前) – OctopusSD
你使用'graph.newTransaction()'然後你正在創建[多線程事務](http://s3.thinkaurelius.com/docs/titan/1.0.0/tx.html#多線程-tx),它創建了一個全新的事務處理對象,這個對象也很重並且總是打開。如果你*明確地*爲每個用戶創建一個,那麼你應該在最後調用'tt.close()'。否則它將保持開放。 –
從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