我正在使用Java API运行neo4j 2.3.0-RC1
嵌入式。它会在没有警告的情况下继续崩溃,而我正试图找出原因。
我以前使用此代码与1.9.8
完全一致。升级到2.0+需要添加事务,改变一些cypher语法,启动时Spring配置,以及一些有限的其他更改。
绝大多数代码保持不变,并且在单元和集成测试中得到确认,功能正确。
引擎启动时,它会在相当稳定的基础上添加新节点。下面的输出显示了290分钟后的一次神秘崩溃。
这似乎总是发生。有时在2小时之后,有时在5之后。1.9.8
从未发生过这种情况。
JVM使用./start-engine.sh > console.out 2>&1 &
运行。
start-engine.sh
的操作行是
$JAVA_HOME/bin/java -server $JAVA_OPTIONS $JPROFILER_OPTIONS -cp '.:lib/*' package.engine.Main $*
以下是console.out
的最后几行。
17437.902: RevokeBias [ 112 6 5 ] [ 20 6 27 43 26 ] 1
17438.020: RevokeBias [ 112 3 9 ] [ 5 0 5 0 0 ] 3
17438.338: GenCollectForAllocation [ 113 2 2 ] [ 1 0 11 4 32 ] 2
17438.857: BulkRevokeBias [ 112 3 13 ] [ 0 0 28 6 2 ] 3
./start-engine.sh: line 17: 19647 Killed $JAVA_HOME/bin/java -server $JAVA_OPTIONS $JPROFILER_OPTIONS -cp '.:lib/*' package.engine.Main $*
没有堆栈跟踪,也没有其他错误输出。
这些是messages.log
/mnt/engine-data
的最后几行
2015-10-30 18:07:44.457+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Check Pointing triggered by scheduler for time threshold [845664646]: Starting check pointing...
2015-10-30 18:07:44.458+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Check Pointing triggered by scheduler for time threshold [845664646]: Starting store flush...
2015-10-30 18:07:44.564+0000 INFO [o.n.k.i.s.c.CountsTracker] About to rotate counts store at transaction 845664650 to [/mnt/engine-data/neostore.counts.db.b], from [/mnt/engine-data/neostore.counts.db.a].
2015-10-30 18:07:44.565+0000 INFO [o.n.k.i.s.c.CountsTracker] Successfully rotated counts store at transaction 845664650 to [/mnt/engine-data/neostore.counts.db.b], from [/mnt/engine-data/neostore.counts.db.a].
2015-10-30 18:07:44.834+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Check Pointing triggered by scheduler for time threshold [845664646]: Store flush completed
2015-10-30 18:07:44.835+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Check Pointing triggered by scheduler for time threshold [845664646]: Starting appending check point entry into the tx log...
2015-10-30 18:07:44.836+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Check Pointing triggered by scheduler for time threshold [845664646]: Appending check point entry into the tx log completed
2015-10-30 18:07:44.836+0000 INFO [o.n.k.i.t.l.c.CheckPointerImpl] Check Pointing triggered by scheduler for time threshold [845664646]: Check pointing completed
2015-10-30 18:07:44.836+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] Log Rotation [35826]: Starting log pruning.
2015-10-30 18:07:44.844+0000 INFO [o.n.k.i.t.l.p.LogPruningImpl] Log Rotation [35826]: Log pruning complete.
所以一切都看起来很好,直到崩溃的那一刻,崩溃就完全出乎意料了。
messages.log
中有很多其他数据,但我不知道我在寻找什么。
$ java -version
java version "1.7.0_65"
Java(TM) SE Runtime Environment (build 1.7.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 24.65-b04, mixed mode)
$uname -a
Linux 3.13.0-65-generic #106-Ubuntu SMP Fri Oct 2 22:08:27 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
答案 0 :(得分:6)
您可能会看到Linux内存不足杀手的影响,这会在系统运行物理内存严重不足时终止进程。这可以解释为什么你在日志中找不到任何内容。
因为许多应用程序预先分配内存并经常分配内存 不利用分配的内存,内核是用的设计的 能够过度提交内存以提高内存使用效率。 ......... 当太多的应用程序开始利用它们被分配的内存时,过度提交模型有时会出现问题,内核必须开始杀死进程......
上面引用的文章是了解OOM Killer的一个很好的资源,并且包含了很多关于如何排除故障并配置Linux以避免问题的信息。
引用this question的答案:
OOM杀手必须选择最佳杀人方法。最好的 是指在杀戮时释放最大记忆的过程 对系统来说也是最不重要的。
由于neo4j进程很可能是系统上占用内存最多的进程,因此当物理资源开始耗尽时它就会被终止。
避免OOM Killer的一种方法是尝试将其他内存密集型进程保留在同一系统之外。这应该使得记忆过度承诺的可能性大大降低。但你至少应该阅读上面的第一篇文章,更好地了解OOM杀手 - 有很多要知道。