OOMKiller使得托pipeJava的机器变得无法响应

我有两台运行在私有vSphere云中的服务器,都运行着JBoss和Tomcat。

  • 机器8 – RHEL5.3,3个“物理”内存,1个交换
  • 机器25 – RHEL4.6,2个“物理”内存,1个交换

机器8经常会变得没有响应,OOMKiller有效地接pipe机器。 通过vSpherepipe理控制台重新启动是唯一的select。

我们一直认为Java应用程序的限制(Xmx等)设置得太高。 因此,在最近的重启之后,我们借此机会减less了JVM上的内存限制,并设置了一些logging某些信息的脚本。

这一次,这个问题似乎发生在两台机器上,虽然这个问题的特定日志只在机器8上。

有趣的是交换使用在一分钟内翻倍,但是Java应用程序的使用却没有。 可悲的是,我们的日志logging集中在JVM上,所以我们不知道实际上请求的是什么内存。

以下是内存使用情况的logging,直到机器停止响应(从各种JVM的顶部信息的日志重新构build):

Time Load Average Phys Used Virt Used 00:19:23 1,01 3016868 380872 00:20:27 3,44 3025136 435216 00:20:32 3,24 3029548 475548 00:21:37 3,51 3023888 864404 00:21:43 3,39 3030808 889608 

所以虚拟内存的使用在2.5分钟内从380兆上升到了889兆。

我知道这个问题,但不知道是否是同样的问题 – 在我们的机器上,Java的使用似乎并不合理,而遭受这个问题的机器最多的机器是在RHEL5.3上。

我们还没有按照链接问题中的build议激活vm.lower_zone_protection选项。

有没有人有任何build议或解释?

另外,机器25是否也是偶然的事实,或者vSphere中的环境可能导致它们都以这种方式作出反应?

这是导致问题的JVM。 基本上,JVM“预先分配”了所有需要的内存,但是内核实际上只是在JVM真正需要的时候“给”内存。 因此,你可以很快地进入你描述的情况(交换使用率上升,OOM杀手横行),没有任何“明显”使用内存 – 因为原则上,内存已经被“使用”了。

解决scheme包括调整JVM不使用尽可能多的内存,closuresovercommit(不是一个好主意,因为我之前解释过的原因),提供更多的交换(机器将慢慢爬行,但不会死,给你一个机会进入和检查问题“现场”),或者只是给虚拟机更多的内存。 这够便宜的。