Titan 1.0.0 图形缓存内存泄漏

Titan 1.0.0 graph cache memory leaks

我在 运行ning TomEE(有点像 Tomcat)服务器 Java 8 并使用带有 Cassandra 后端和 Elasticsearch 索引的 Titan 1.0.0 作为我的数据库。在我的开发环境中,用户连接很少,一切都运行良好,但在我的生产服务器上,许多用户连接了很多数据库访问,我们遇到了内存泄漏问题,这可能是因为 Titan 图形缓存或 Titan 相关的东西。我已经配置了 4GB 的堆大小,经过 10 多个小时 运行 后,堆上分配的内存增长到最大值(每小时约 300Mb),这导致 GC(垃圾收集器)无法再清理并仍然存在连续 运行 导致服务器实例无响应。 使用 VisualVM 我做了一些内存分析,这些是我的屏幕截图:
任何建议我们如何解决这个问题或找到更详细地调查这个问题的方法?在这种情况下,一些 GC 参数可能对我们有帮助吗?

我以前在 Titan 1.0 和 Cassandra 上见过这些问题。要检查两件事:

打开和关闭图形

您是为每个用户打开不同的图表交易还是为每个用户打开不同的图表?也就是说,你在做什么:

(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();

每个交易在用户完成后关闭。