我正在运行最大堆大小为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。
答案 0 :(得分:4)
除了由-Xmx
控制的Java堆之外,还有几个内存接收器:
ByteBuffers
并映射ByteBuffer
在不知道系统细节的情况下,我猜,有些东西使用映射的ByteBuffers
。
但是你可以通过检查pmap
命令的输出来深入研究这个问题。它列出了进程的所有内存区域以及任何区域映射到的文件名(如果区域当然是映射的)。