从我能告诉我有一个问题与我的Neo4j v2.3社区Java VM添加项目到旧Gen堆,永远不能垃圾收集他们。Neo4j Java虚拟机调优(v2.3社区)
以下是详细的情况。
我有一个PHP文件,它调用Dropbox Delta API并将文件结构写出到我的Neo4j数据库中。对Delta的每次调用都会返回一个2000条款数据集,其中我提取了我需要的信息,下面是一个例子,该查询只包含一个项目,通常我发送2000批次的全部项目,因为它给了我最好的结果。
***Following is an example Query***
MERGE (c:Cloud { type:'Dropbox', id_user:'15', id_account:''})
WITH c
UNWIND [
{ parent_shared_folder_id:488417928, rev:'15e1d1caa88',.......}
]
AS items MERGE (i:Item { id:items.path, id_account:'', id_user:'15', type:'Dropbox' })
ON Create SET i = { id:items.path, id_account:'', id_user:'15', is_dir:items.is_dir, name:items.name, description:items.description, size:items.size, created_at:items.created_at, modified:items.modified, processed:1446769779, type:'Dropbox'}
ON Match SET i+= { id:items.path, id_account:'', id_user:'15', is_dir:items.is_dir, name:items.name, description:items.description, size:items.size, created_at:items.created_at, modified:items.modified, processed:1446769779, type:'Dropbox'}
MERGE (p:Item {id_user:'15', id:items.parentPath, id_account:'', type:'Dropbox'})
MERGE (p)-[:Contains]->(i)
MERGE (c)-[:Owns]->(i)
***The query is sent via Everyman****
static function makeQuery($client, $qry) {
return new Everyman\Neo4j\Cypher\Query($client, $qry);
}
这工作正常,一般从开始到结束需要8-10秒运行。
我正在访问的Dropbox帐户包含大约35000个项目,并且需要大约18次运行我的PHP才能使用Dropbox帐户的文件夹/文件结构填充我的Neo4j数据库。
随着这个PHP的每次运行,大约50MB的项目被添加到Neo4j JVM Old Gen堆中,30mb未被GC删除。
最终结果显然是虚拟机内存耗尽,并陷入GC节流的不变状态。
我试过了一系列的Neo4j虚拟机设置,以及从Neo4j v2.2.5到v2.3的更新,这实际上已经使问题变得更糟。
我目前的设置如下,
-server
-Xms4096m
-Xmx4096m
-XX:NewSize=3072m
-XX:MaxNewSize=3072m
-XX:SurvivorRatio=1
我在Windows 10的测试用PC的RAM和8GB的酷睿i5 2.5GHz的四核处理器。 Java 1.8.0_60
有关如何解决此问题的任何信息将不胜感激。 干杯,杰克。
感谢您的回复,问题似乎有所减轻。 到目前为止,我们已经管理转换查询使用参数和更新服务器设置。现在正在考虑切换neo4j客户端。 大量的项目仍然达到了我所关心的老一代,因为neo4j性能调优指南指出 '堆的理想尺寸和调节方式应使得事务和查询状态永远不会对老一代产生影响。 在运行完PHP提到的变化后,我们仍然以〜700mb添加到老一代,但至少现在全部用GC删除了。 –
当它出现在几个版本中时,也尝试更新到2.3.1天。 –