在VPS上获得“java.lang.OutOfMemoryError:无法创建新的本机”虽然有足够的内存

时间:2011-12-02 14:45:58

标签: java multithreading out-of-memory vps

我无法弄明白,为什么我会收到此错误。它并不总是显示,但一旦出现,我的应用程序拒绝接受连接(不能创建新的Socket-Threads,以及我在JAVA应用程序中为其中一些创建的其他线程,我使用ThreadPool)。 / p> 顶部和htop显示我,有大约900 MB的2048MB使用。 并且还有足够的堆内存,大约200MB空闲。

cat / proc / sys / kernel / threads-max outputs:

1196032

而且,几天前一切正常,它是一款多人在线游戏,我们在线有超过200个用户(总共约500个线程)。但是现在,即使有80个用户在线(约200个线程),10分钟或几个小时后,我的应用程序因为这个OutOfMemoryError而被破坏了。在这种情况下,我会重新启动我的应用程序,并再次只在这么短的时间内工作。

我很好奇,如果JVM在VPS上行为奇怪,因为同一台物理机上的其他VPS也使用JVM。这甚至可能吗? 提供商是否存在某种对我不可见的限制? 还是有某种服务器攻击?

我还应该提到,当这个错误发生时,有时munin无法记录数据大约只有10分钟。看图形图像,只有白色空间,就像munin根本不工作一样。而且当时htop告诉我,大约有1 GB内存空闲。

也可能是我们的情况,我在某​​种程度上在我的应用程序中产生了一个错误。在我完成更新后开始收到此错误。但即便如此,我在哪里开始调试?

4 个答案:

答案 0 :(得分:1)

尝试增加堆栈大小(-Xss)

答案 1 :(得分:1)

您似乎在某些远程vps服务器中托管您的应用。你确定服务器,而不是你的开发盒,有足够的RAM。人们经常将自己的机器与远程机器混淆。

因为如果Bash的内存不足,显然是系统内存问题,而不是App Memory问题。在远程计算机上发布free -mulimit -a的结果以获取更多数据。

如果您不信任您的提供商使用某些特洛伊木马htopfreeulimit,您可以使用malloc 70分配的简单C程序测试实际可用内存大约80%的可用内存,并在不超过10行ANSI C代码上分配随机字节。你可以在你的盒子上静态编译它以避免任何弯曲的libc,然后用scp传输它。话虽这么说,我听说有关vps提供商给出的承诺少于承诺但从未遇到过的传言。

答案 2 :(得分:0)

从VPS转移到专用服务器解决了我的问题。 另外我发现了这个

https://serverfault.com/questions/168080/java-vm-problem-in-openvz

这可能就是这种情况,因为在VPS上我的“私密性”实在太低了。在VPS中似乎确实存在一些奇怪的JVM行为。 正如我已经在评论中所写,即使其他程序(ls,top,htop,less)也无法在某个时间启动,尽管有足够的内存可用/免费。 并且..提供商确实对他们的系统做了一些改变。

还要感谢大家,非常快速的回复并帮助我解开这个谜团。

答案 3 :(得分:0)

你应该尝试JRockit VM它在我的OpenVZ VPS上运行得很好,它消耗的内存远远少于Sun / Oracle jvm。