從我能告訴我有一個問題與我的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天。 –