对Java内存使用异常进行故障排除

时间:2019-01-06 11:02:46

标签: java out-of-memory

我正在尝试对Java程序进行故障排除,该Java程序需要越来越多的内存,直到无法分配更多内存,然后它崩溃。

编辑有关该程序的更多信息。该程序是一个索引器,它处理成千上万的文档并将它们编入索引以进行搜索。在执行某些处理之后,将从MongoDB中读取文档并将其写入MongoDB。在处理过程中,我使用的是RocksDB(Maven的rocksdb-jni版本5.13.4)。 GitHub issue中提到了一些RocksDB内存使用量不受控制的增长,但是我不确定这可能是相关的。

使用visualvm监视过程的结果如下图所示:

Memory usage on visualvm

但是在计算机上运行htop会显示完全不同的统计信息:

htop stats

我无法跟踪其来源有几个GB的内存。

使用以下VM参数启动程序:

jvm_args: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=<port> -Djava.rmi.server.hostname=<hostname> -Xmx12G -XX:+UseStringDeduplication 

系统具有32GB的RAM,没有交换空间。在这32 GB中,约10GB总是由tmpfs分区占用,约8GB由MongoDB占用,其余的12GB分配给程序。 编辑上面的visualvm屏幕快照显示了20GB的堆大小,因为它来自我通过-Xmx20G的前一次运行;但是,无论我将12GB还是20GB分配给堆,其行为都是相同的。如果我删除tmpfs分区,释放了10 GB以上的内存,行为也不会改变:它只需要更长的时间,但是最终它将耗尽内存。

我不知道visualvm中未显示但出现在htop中的内存使用量是从哪里来的。我应该使用什么工具来了解发生了什么?该应用程序正在远程服务器上运行,因此我希望仅在控制台中使用或可以配置为远程工作的工具,例如visualvm。

0 个答案:

没有答案