我有一个带20GB RAM的VPS,Ubuntu OS。我试图使用JAVA_TOOL_OPTIONS将10GB RAM作为最大堆分配给java,但我不能。请参阅随附的屏幕截图。它显示可用内存为17GB。它在我尝试设置为7GB时工作。但只有在>时才会发生堆错误。 7GB。我已经安装了glassfish并将3Gb分配给了它的集群。它的工作正常。但是当我有17GB的RAM空闲时,为什么我无法分配超过7GB的空间。
ULIMITS
OverCommit memory
我的硬件是虚拟托管的。以下是配置
答案 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
您正在运行:
和其他各种东西。 " virt"是他们的总虚拟内存占用量,其中一些将是可以共享的代码段。
他们似乎有一个很小的" res" (驻地记忆)此刻这就是为什么有这么多的免费RAM。然而,如果它们中的一些同时出现在系统中,对RAM的需求将会急剧上升,系统可能会开始肆虐。
我的建议是将Hudson和Nexus服务移至单独的VM。或者,如果无法做到这一点,请增加交换空间的大小......并希望您不要摔倒。
这是事实。但这是正常行为吗?
是
这是内存分配的工作原理吗?
是。这确实是虚拟内存的工作原理。
我现在对Resident内存,虚拟内存和物理内存感到困惑。
我建议您先阅读virtual memory上的维基百科页面,而不是详细解释。
答案 2 :(得分:0)
我之所以无法分配超过5G的原因是因为 privvmpages 设置为5G。
我们可以通过这个命令在linux中获取该信息" cat / proc / user_beancounters "
此外,在VPS中,托管服务提供商不允许我们自定义此值。我们必须选择大型虚拟服务器或专用服务器来增加此限制。
这是根本原因。然而,斯蒂芬和罗宾关于虚拟内存和RES内存的解释都是正确的。谢谢大家