Ubuntu中的Java OutofMemory错误即使有足够的可用内存

时间:2015-10-09 13:51:20

标签: java memory jvm heap

我有一个带20GB RAM的VPS,Ubuntu OS。我试图使用JAVA_TOOL_OPTIONS将10GB RAM作为最大堆分配给java,但我不能。请参阅随附的屏幕截图。它显示可用内存为17GB。它在我尝试设置为7GB时工作。但只有在>时才会发生堆错误。 7GB。我已经安装了glassfish并将3Gb分配给了它的集群。它的工作正常。但是当我有17GB的RAM空闲时,为什么我无法分配超过7GB的空间。

enter image description here

enter image description here

热门 enter image description here

ULIMITS

enter image description here

Java -version enter image description here

OverCommit memory

enter image description here

我的硬件是虚拟托管的。以下是配置

  • 架构:x86_64
  • CPU op-mode(s):32位,64位
  • 字节顺序:Little Endian
  • CPU:16
  • 供应商ID:GenuineIntel
  • CPU系列:6
  • 型号:26
  • 步进:5
  • CPU MHz:2266.802
  • BogoMIPS:4533.60
  • 虚拟化:VT-x

3 个答案:

答案 0 :(得分:2)

如果我不得不猜测,你没有7GB的连续内存块,这看起来很奇怪,但是如果不了解更多关于你VM的分配的话,很难说。

以下是Oracle就此事(http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_oom)所说的话:

  

VM打印“OutOfMemoryError”并退出。增加最大堆大小   没有帮助。发生了什么事?

     

如果内存是Java HotSpot VM,则无法扩展其堆大小   完全分配,没有可用的交换空间。这可能发生,   例如,当多个应用程序同时运行时。   发生这种情况时,VM将在打印类似的消息后退出   以下。

     

异常java.lang.OutOfMemoryError:请求的字节

     

-Xmx-XMS-XMX

     

有关详细信息,请参阅错误4697804的评估部分。

答案 1 :(得分:1)

我认为你可能没有交换空间。当我在" virt"中添加内存时专栏,它达到了40+ Gb。

  

为什么它占用了那么多的交换空间?需要做些什么来解决这个问题?

嗯,根据top您正在运行:

  • Glassfish - 9.1G
  • MySQL守护进程 - 5.4G
  • 哈德森 - 8.9G
  • Nexus - 6G
  • Glassfish - 6.9G(第二次)

和其他各种东西。 " virt"是他们的总虚拟内存占用量,其中一些将是可以共享的代码段。

他们似乎有一个很小的" res" (驻地记忆)此刻这就是为什么有这么多的免费RAM。然而,如果它们中的一些同时出现在系统中,对RAM的需求将会急剧上升,系统可能会开始肆虐。

我的建议是将Hudson和Nexus服务移至单独的VM。或者,如果无法做到这一点,请增加交换空间的大小......并希望您不要摔倒。

  

这是事实。但这是正常行为吗?

  

这是内存分配的工作原理吗?

是。这确实是虚拟内存的工作原理。

  

我现在对Resident内存,虚拟内存和物理内存感到困惑。

我建议您先阅读virtual memory上的维基百科页面,而不是详细解释。

答案 2 :(得分:0)

我之所以无法分配超过5G的原因是因为 privvmpages 设置为5G。

我们可以通过这个命令在linux中获取该信息" cat / proc / user_beancounters "

此外,在VPS中,托管服务提供商不允许我们自定义此值。我们必须选择大型虚拟服务器或专用服务器来增加此限制。

这是根本原因。然而,斯蒂芬和罗宾关于虚拟内存和RES内存的解释都是正确的。谢谢大家