我有一台机器,它将大约502,000,000行插入到BDB JE中。键和值的一个例子是:
juhnegferseS0004-47-19332 39694.290336
所有键和值的长度大致相同。JVM通过以下参数启动:
-Xmx9G -Xms9G -XX:+UseConcMarkSweepGC -XX:NewSize=1024m -server
但是,当它达到~50,000,000行时,JVM被"杀死"(我只是得到消息"被杀死",不知道它是如何/由谁被杀死的)。我只是猜它试图运行垃圾收集,然后它无法释放足够的内存或其他东西。但是,有了这么多的-Xmx,我想应该不会有任何问题。
我使用deferredWrites,日志文件的大小设置为100MB。从DPL切换到Base API没有任何区别。
我使用JDK 6.0和SUSE x86_64与12GB的RAM。还有其他进程需要剩余的RAM,因此不能为这个插入任务分配超过9GB的内存。
JVM:java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
我不认为JVM会死,并建议您尝试稍后(甚至更早)的JVM版本(我说的是一个小版本,例如JDK1.6.0_21 vs JDK1.6.0._22),以看看您是否可以避免触发可能的错误。
我的另一个想法是,也许您遇到了Linux OOM杀手级问题(与内存过度提交有关)。
没有适用于所有情况的单一解决方案。您必须尝试不同的GC收集器,以查看哪一个在给定情况下表现最好。
虽然这是一个老问题,但最近我遇到了同样的问题。我解决问题的方法是使用gc日志分析器(我发现GCeasy非常好用)和Eclipse内存分析器来深入了解问题。
然后我发现com.sleepycat.je.tree.BIN
类几乎占用了JVM的内存。在我的情况下,JE的缓存不是那么重要(我的应用程序是一个迁移应用程序)。因此,我将CashMode.EVICT_BIN
设置为我的数据库。
我的意思是解决方案可能不在于JVM选项,而在于应用程序本身。