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

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 服务器进程,通常使用以下配置运行

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

它运行起来非常顺畅。但随着时间的推移,随着我的应用程序数据的增长,这将不足以满足正常运行。

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

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

而发生的情况是,当它启动应用程序时,它会耗尽所有“低内存”,然后我的应用程序崩溃(并且通常会有来自内核的堆栈跟踪消息,但不是恐慌或错误)

这时,我完蛋了——这个已停止的进程似乎占用了所有低内存,oom-killer 开始杀死所有进程。我必须重启才能修复它。

但是当我回到 700 MB 时,它又像冠军一样运行,并且根本不使用太多的“低内存” - (我的意思是,分配了大约 690 MB 的低内存,而只使用了大约 140 MB)

[]$ 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,但如果这种情况还有其他已知问题,我很乐意听听。更换内核可能会有问题,但如果有任何服务器本地配置更改,我可以进行更改以使用高内存而不是低内存。

答案1

我以前也遇到过类似的问题,但那是在使用 OpenVZ VPS 而不是 Xen 时遇到的。除了升级 Java,您可能还想尝试其他 JVM,例如甲骨文JRockit或者IBM JDK,它们不一定以相同的方式分配内存,而且可能刚好解决您的问题。

答案2

低内存由内核使用 - 您将具有以下级别

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

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

还有一件要研究的事情是,xen 有一个气球驱动程序,它会报告比实际更多的内存 - 这是因为主机(不是 vps)会尝试为 vps 提供比实际可用内存多一点的内存 - 但如果主机很忙就没有内存,你的进程就会被杀死...请与你的 vps 提供商核实。

相关内容