Java Neo4J 3.x比Neo4J 2.x使用更多内存?如何避免这种情况?
我将Graph DB从Neo4J 2.0.4更新为Neo4J 3.3.3,当我用我的应用程序运行它时,它现在使用的内存比以前多了两倍(Java Neo4J 3.x比Neo4J 2.x使用更多内存?如何避免这种情况?,java,memory-management,neo4j,graph-databases,Java,Memory Management,Neo4j,Graph Databases,我将Graph DB从Neo4J 2.0.4更新为Neo4J 3.3.3,当我用我的应用程序运行它时,它现在使用的内存比以前多了两倍(javaprocess on my Mac)。(我在Mac上运行Java 1.8) 当我启动Neo4J 2时,对于相同的任务和查询,它使用了大约250Mb的内存。但是Neo4J 3使用了大约500Mb 我以为更新应该更有效 减少内存使用的可能方法是什么?Neo4j基于JVM,其内存消耗取决于堆的大小 如果您没有配置它的大小,Neo4j有一个启发式算法来计算它,当这
java
process on my Mac)。(我在Mac上运行Java 1.8)
当我启动Neo4J 2时,对于相同的任务和查询,它使用了大约250Mb的内存。但是Neo4J 3使用了大约500Mb
我以为更新应该更有效
减少内存使用的可能方法是什么?Neo4j基于JVM,其内存消耗取决于堆的大小 如果您没有配置它的大小,Neo4j有一个启发式算法来计算它,当这个启发式算法改变时 在Neo4j 3.X中,有3个内存空间: JVM堆 堆用于存储所有事务的数据、节点和关系上的锁,以及缓存查询的执行计划 您可以在
conf/neo4j.conf
中配置其大小:
# Java Heap Size: by default the Java heap size is dynamically
# calculated based on available system resources.
# Uncomment these lines to set specific initial and maximum
# heap size.
dbms.memory.heap.initial_size=512m
dbms.memory.heap.max_size=512m
# The default page cache memory assumes the machine is dedicated to running
# Neo4j, and is heuristically set to 50% of RAM minus the max Java heap size.
dbms.memory.pagecache.size=10g
页面缓存
数据库在磁盘上执行大量IO。为了快速,它需要将数据放入RAM中。
Neo4j 3.X通过pagecache机制实现,该机制将二进制数据文件的某些部分放入RAM中。因此,您最常用的数据是在RAM中
这可以在conf/neo4j.conf
中配置:
# Java Heap Size: by default the Java heap size is dynamically
# calculated based on available system resources.
# Uncomment these lines to set specific initial and maximum
# heap size.
dbms.memory.heap.initial_size=512m
dbms.memory.heap.max_size=512m
# The default page cache memory assumes the machine is dedicated to running
# Neo4j, and is heuristically set to 50% of RAM minus the max Java heap size.
dbms.memory.pagecache.size=10g
索引
索引用于快速查找查询的节点,但如果这些索引不在RAM中,则速度会很慢
在Neo4j中没有办法配置这个内存大小,但是使用三个规则很容易计算(服务器RAM=堆+页面缓存+索引+操作系统的一些空闲内存)
您可以使用以下命令计算索引的大小:
$> du -sh data/databases/graph.db/indexes
结论
自Neo4j 2以来,有很多改进(功能性、性能),因此是的,它更高效
更有效的关于RAM上的指纹,我不知道,我从来没有做过这样的测试,但RAM现在很便宜
我唯一能告诉你的是,你应该需要一个更小的堆,数据缓存现在已经脱离堆了。在2.X中,Neo4j在内存中保存了一个图形,以便快速访问
但是Neo4j是高度可配置的,因此如果您有一台小型服务器,并且想要微调内存消耗,则必须设置堆和页面缓存大小。如何分析Neo4j的内存消耗?您是否进行了一些Neo4j配置(例如这里)或默认设置?这是默认设置,我使用Mac OS XHello中的Activity Monitor对其进行了分析,谢谢您的回答!那么你的意思是我应该设置一个较小的堆大小吗?我不知道,这取决于:)使用较小的堆大小进行测试,看看是否有大量GC(以及内存不足);如果性能适合您的用例等。。。在所有情况下,我明确建议您配置堆大小和页面缓存