这是一个有关针对JanusGraph执行操作时发现的java.lang.OutOfMemoryError: GC overhead limit exceeded
问题的问题。
我正在运行JanusGraph版本0.2.0
,并将Cassandra作为基础存储。我正在使用here中所述的默认配置值,但将我的存储后端描述为cql
和存储主机的配置除外。
我要在图中插入大量用户-每个人都有(1)电子邮件,(2)用户ID和(3)相关的分组标签。对于这种情况,所有用户都在同一个分组中,我们将其称为groupA
。
插入操作是按顺序进行的,每个操作都在上一次完成后立即执行。
在每次插入操作期间,我创建一个代表电子邮件的顶点,一个代表用户ID的顶点,然后创建或更新代表groupA
的顶点。我在(1)电子邮件<->用户ID顶点之间创建一条边,并在(2)用户ID <-> groupA
顶点之间创建一条边。
我使用了探查器来观察过程中的堆空间使用情况。插入开始时没有问题,但是随着插入次数的增加,使用的堆空间也增加了。最终,随着使用更多的内存,我运行了几个小时后遇到了内存不足的异常。
-
然后我第二次重复插入,但是这次我没有包含groupA
顶点。这次,内存使用随时间显示了标准的锯齿模式,如下所示。
这使我得出结论,我观察到的内存不足问题是由于涉及此高度groupA
顶点的操作引起的。
我目前怀疑JanusGraph上有一些缓存过程,用于存储最近访问的元素。由于高度组顶点的邻接列表很大,因此可能会缓存大量数据,仅当我创建从组顶点到用户ID顶点的边缘越来越多时,数据才会增加。
使用我的探查器,我发现org.janusgraph.graphdb.relations.RelationCache
类的内存使用率相对较高,因此这似乎很重要。
我的问题是:随着时间的流逝,JanusGraph的内存使用率越来越高是什么原因?