Java进程吃掉了我的Xen VPS上的所有“低内存”

这是在Centos 5,Linux 2.6.33.3-xenU#1 SMP周五5月5日00:49:22 UTC 2010 i686 i686 i386 GNU / Linux

我有一个java服务器进程,我通常运行以下configuration

-Xmx700m -Xms500m -XX:PermSize=128m -noclassgc 

它像冠军一样运行。 但随着时间的推移,随着应用程序数据的增长,这对于正常的操作来说还是不够的。

最近,我添加了更多的内存给我的VPS,我试图扩展内存:

 -Xmx1024m -Xms1024m -XX:PermSize=256m -noclassgc 

结果是,当它启动应用程序时,它会吃掉所有“低内存”,并且我的应用程序崩溃了(而且内核通常有一个堆栈跟踪消息,但不是一个恐慌或错误)

在这一点上,我敬酒 – 这个已经停止的过程似乎拥有了所有的低级记忆,杀手们开始杀死所有的东西。 我必须重新启动来修复它。

但是当我回到700兆时,它再次像冠军一样运行,根本没有使用太多“低存储量”(我的意思是,大约有690兆的内存分配不足,只有140兆左右)

 []$ free -lm total used free shared buffers cached Mem: 2700 1334 1365 0 100 274 Low: 689 140 548 High: 2011 1194 816 -/+ buffers/cache: 959 1740 Swap: 714 0 714 

Java是1.6:

 java version "1.6.0" Java(TM) SE Runtime Environment (build 1.6.0-b105) Java HotSpot(TM) Server VM (build 1.6.0-b105, mixed mode) 

有谁知道这是为什么发生? 我正在计划升级Java,但是如果这个场景还有另一个已知的问题,我很乐意听到。 更换内核可能会有问题,但如果有任何服务器本地configuration更改,我可以使用高内存,而不是低内存。

过去我也遇到类似的问题,但那是OpenVZ VPS而不是Xen。 除了升级Java之外,您还可能想要尝试其他的JVM,例如Oracle JRockit或IBM JDK ,它们不一定以相同的方式分配内存,而只是解决您的问题。

低内存被内核使用 – 你将有以下级别

  • 0-16MB – 内核使用的非常低级别的例程
  • 16MB – 768MB – 内核堆
  • 768MB – MAX_MEM – 用于进程。

即使你将Xmx1024m设置为1024–这并不意味着jvm不会占用更多的内存(应用程序可用的内存+ jvm本身就是1024) – 查看实际的内存占用情况,请使用ps -elF或top 。

还有一件事要注意的是,xen有一个气球驱动程序,它会报告更多的内存,然后你实际上是因为主机(而不是vps)会尝试给vps多一点内存,然后实际上是可用的 – 但如果主机忙,就没有内存,你的进程就被杀死了……请检查你的vps提供商。