我正在运行最大堆大小为128 MB(-Xmx128M)的Java应用程序.它正在运行成功完成,没有OutOfMemoryError或任何其他未处理的异常.因此,我假设它的实际堆大小确实保持在128 MB的声明限制内.
但是,在观察此Java应用程序的进程时,我看到峰值总内存使用量为4,188,548 KB(~4 GB).这是堆的受控最大大小的30倍以上的增长.虽然我知道这个值包括分配的虚拟内存可能远远大于实际使用的物理内存,但它会影响硬限制,例如Sun Grid Engine强加的限制,因此它是有意义的.
这到底有多大可能?我知道JVM消耗的总内存比堆的大小要多得多,但是我不明白除了应用程序实际创建对象和执行计算所需的内存之外,它还需要几GB的额外内存. .
我在64位RHEL Linux发行版上使用Sun Java 1.6.0.31.
除了由 控制的 Java 堆之外,还有几个内存接收器-Xmx:
ByteBuffers和映射ByteBuffer在不知道您的系统详细信息的情况下,我猜想,某些东西使用了mapped ByteBuffers。
但是您可以通过检查命令的输出来深入研究该问题pmap。它列出了进程的所有内存区域以及任何区域映射到的文件名(当然如果这些区域已映射)。