我无法弄明白,为什么我会收到此错误。它并不总是显示,但一旦出现,我的应用程序拒绝接受连接(不能创建新的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内存空闲。
也可能是我们的情况,我在某种程度上在我的应用程序中产生了一个错误。在我完成更新后开始收到此错误。但即便如此,我在哪里开始调试?
答案 0 :(得分:1)
尝试增加堆栈大小(-Xss)
答案 1 :(得分:1)
您似乎在某些远程vps服务器中托管您的应用。你确定服务器,而不是你的开发盒,有足够的RAM。人们经常将自己的机器与远程机器混淆。
因为如果Bash的内存不足,显然是系统内存问题,而不是App Memory问题。在远程计算机上发布free -m
和ulimit -a
的结果以获取更多数据。
如果您不信任您的提供商使用某些特洛伊木马htop
,free
和ulimit
,您可以使用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。