Memory leaks Titan 1.0.0图形缓存内存泄漏

Memory leaks Titan 1.0.0图形缓存内存泄漏,memory-leaks,garbage-collection,java-8,titan,apache-tomee,Memory Leaks,Garbage Collection,Java 8,Titan,Apache Tomee,我在Java8上运行TomEE(类似Tomcat)服务器,并使用Titan 1.0.0,使用Cassandra后端和Elasticsearch索引作为我的数据库。在我使用小用户连接的开发环境中,一切都很完美,但在我使用多用户连接多数据库访问的生产服务器上,我们遇到了内存泄漏问题,可能是因为Titan graph cache或Titan相关的东西。我已经配置了4GB堆大小,在运行超过10个小时后,堆上分配的内存将增长到最大值(每小时约300Mb),这会导致GC(垃圾收集器)无法再清理,继续运行,从

我在Java8上运行TomEE(类似Tomcat)服务器,并使用Titan 1.0.0,使用Cassandra后端和Elasticsearch索引作为我的数据库。在我使用小用户连接的开发环境中,一切都很完美,但在我使用多用户连接多数据库访问的生产服务器上,我们遇到了内存泄漏问题,可能是因为Titan graph cache或Titan相关的东西。我已经配置了4GB堆大小,在运行超过10个小时后,堆上分配的内存将增长到最大值(每小时约300Mb),这会导致GC(垃圾收集器)无法再清理,继续运行,从而导致服务器实例无响应。 我使用VisualVM进行了一些内存分析,以下是我的截图:

有人建议我们如何解决这个问题,或者找到更详细地调查这个问题的方法吗?在这种情况下,一些GC参数可以帮助我们吗

我以前在《泰坦1.0》和《卡桑德拉》上看到过这些问题。有两件事需要检查:

打开和关闭图表

您是为每个用户的图形打开不同的事务,还是为每个用户打开不同的图形?i、 e.你正在做:

(一)

(二)

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

每个事务在用户完成后关闭

我正在使用第二种方法。我打开了一个到图形的连接,并为每个用户请求打开新事务
TitanTransaction tt=graph.newTransaction()
。每个事务都很短(添加或更新一个或两个顶点或边,或从顶点查询数据),并且在结束时始终提交事务
tt.commit()
或回滚
tt.rollback()
如果失败(在引发一些异常之前),是否使用
graph.newTransaction()
然后您将创建一个全新的事务处理对象,该对象也很重,并且始终处于打开状态。如果显式地为每个用户创建一个,那么最后一定要调用
tt.close()
。否则它将保持打开状态。我和Titan认为
tt.commit()
tt.rollback()
将关闭事务,但在每次提交和回滚旁边添加
tt.close()
后,它解决了内存泄漏问题。
graph = TitanFactory.open(config);
//User 1 Logs in
soStuffWithGraph(graph);
//User 2 Logs in
soStuffWithGraph(graph);
graph = TitanFactory.open(config);
//User 1 Logs in
soStuffWithGraph(graph);
graph.tx().close();
//User 2 Logs in
soStuffWithGraph(graph);
graph.tx().close();