为什么相同的 Java 服务在 1 核上运行比在 2 核上运行占用高达 4 倍的 RAM

为什么相同的 Java 服务在 1 核上运行比在 2 核上运行占用高达 4 倍的 RAM

我有一个运行基于 Java 8 的服务器进程的 Ubuntu 18.04 VM 映像。在单核 EC2t2.small实例(2GB RAM)上运行时,它的 RSS 起始值为 432M。在与双核(同样为 2GB RAM)运行完全相同的服务器映像时t3.small,服务在启动时 RSS 会飙升至 876M。在 Java 10 上,差异更加明显:有时它从 1586M RSS 开始。性能会受到明显影响。

任何时候都不会使用任何交换。

完全相同的服务器映像,结果却大不相同。唯一重要的变量似乎是核心数量。

然而,在运行jmap查看堆的使用情况后,我注意到 RSS 下降了一半,大约是我预计的 t2 上的情况。堆转储显示 t2 或 t3、Java 8 或 Java 10 之间的实际分配没有实际差异。

所以,我想知道:这是 JVM 还是 OS 的行为不同?我知道我可以MaxHeapFreeRatio让 JVM 更快地释放内存,但这是 JVM 对内存状况做出的反应,还是 OS 做出的反应?

答案1

默认堆大小实际上取决于处理器数量,并且来自 JVM。从 Java 8文档:服务器级机器是具有至少 2 个 CPU 和至少 2GB 物理内存的机器。

t2.small是单核实例,因此 java 默认使用客户端 JVM 设置,并以较低的堆大小启动。

t3.small属于服务器 JVM 设置,JVM 以更高的堆大小启动。

除非您的程序创建了足够多的对象来需要它,否则 JVM 实际上不会使用最大堆大小。它仅分配给将来可能使用。

有关 Java 8 的更多信息这里,并且我相信 Java 10 只有更新/更高的默认值,但逻辑是一样的。

相关内容