我运行了7个不同的Java守护进程(全部在3台不同的服务器上)。Java命令行使用了-Xmx2048m和-Xss1024k。在这些3台服务器上,所有21个进程在top和atop中显示的VIRT大小都略小于2.5GB。根据每个守护程序的不同,RES大小从300MB到1.9GB不等。
这一切都符合预期。
现在引入了一台新服务器。它拥有更快的CPU、更多的RAM(16GB而不是8GB),稍微更新的Java(旧服务器上为1.6.0_10-b33,新服务器上为1.6.0_31-b04)。这两个系统(和JVM)都是64位的。
我将其中的2个守护进程迁移到了新服务器。在新服务器上,给定相同的任务,这两个守护进程消耗的CPU要多得多(约等于一个核心),并且完成的工作量要少。这些守护进程从旧系统上的5110个处理器迁移到新系统上的5620个处理器。
一个守护进程报告使用了几乎完整的额外CPU使用率(GC线程??),并显示5GB VIRT和2GB RES,另一个守护进程则显示10.5GB VIRT和2GB RES。
有什么想法会导致Java忽略(或表现为忽略)内存限制吗?
Xmx
不是指定 JVM 的内存使用量,而是指定堆分配池的最大大小,这只是 JVM 使用的内存池之一。 - skaffman