上周我偶然发现了一些有趣的问题,我注意到我们的一个生产服务器,它运行 Tomcat 上的Apache HTTP服务器,停止,报告 HTTP 中断。
在进一步调查这个问题时,它似乎是由于 JVM 导致内存页面被快速换出。这导致交换空间被完全填充,从而在下次将页面移动到交换时导致内存问题。
进一步调查,我们的一些 Linux 发行版似乎有一个 JVM 交换因子默认设置为 60%。根据一些研究,对于具有高流量的 Web 服务来说,这似乎具有很高的价值。我们的交换空间设置为 2 GB。
交换详情如下:
Filename Type Size Used Priority
/dev/sda3 partition 2096472 1261420 -1
From /proc/meminfo
SwapCached: 944668 kB
我们的JVM属性如下:
-Xmx6g -Xms4g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:PermSize=512M -XX:MaxPermSize=1024M -XX:NewSize=2g -XX:MaxNewSize=2g -XX:ParallelGCThreads=8
服务器运行 12 GB RAM。
Swappiness 不适合 JVM 的GC进程。因此,我尝试将 swappiness 降低到 0,但这并没有改变任何东西。我们仍然看到整个交换空间被消耗并导致 OutOfMemory 错误的情况。
如何调整 JVM 性能?