我们的linux服务器上有4GB,但我们目前只能使用〜1.8GB的Java服务器,这是下面列出的第一个java进程。 (200 MB是免费的,所以我们可以最大限度地使用1.6GB + 0.2GB)
当我们使用更多的时候机器崩溃了。 所以我们指定-Xmx1600m和-XX:MaxPermSize = 200m将服务器RAM限制为1.8GB。 但是我们需要更多的内存! 剩下的RAM在哪里?
这是根据内存使用情况sorting的顶层程序输出(通过大'M'):
Mem: 4083952k total, 3857856k used, 226096k free, 169320k buffers Swap: 2104504k total, 176k used, 2104328k free, 1939080k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 28155 root 16 0 1835m 1.6g 7848 S 2 40.5 47:36.26 java 19609 root 16 0 45996 7052 3148 S 0 0.2 14:35.97 httpd2-prefork 6802 root 16 0 46132 5916 1932 S 0 0.1 0:00.09 httpd2-prefork 6866 root 15 0 46132 5916 1932 S 0 0.1 0:00.07 httpd2-prefork
正如你所看到的,有很多(甚至更多)httpd2-prefork进程。 但即使我累积字节(25 *〜46KB =〜1MB)也不会那么大。
free -m打印:
total used free shared buffers cached Mem: 3988 3768 219 0 165 1894 -/+ buffers/cache: 1708 2279 Swap: 2055 0 2055
我的错误在哪里? 我可以调整服务器给Java进程更多的RAM?
顺便说一句:我们没有使用像这样的虚拟机
更新
正如它在评论中指出的那样:它只是一个32位内核:-(通过uname -a)所以我至less只能使用3GB?但是服务器本身似乎是64位?由于lm(long模式)在输出?
grep flags /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe lm constant_tsc pni monitor ds_cpl cid cx16 xtpr ...
这是另一个非常类似的问题。
啊,我看你已经弄错了如何在Linux中计算可用RAM。
Linux倾向于通过caching东西来大量利用所有的RAM。 它不是每次从磁盘读取目录列表,而是将目录项caching在RAM中。 它caching经常使用的文件,所以不需要每次都从磁盘加载。 如果某些进程实际上需要使用RAM,caching将立即被驱逐。
所以计算实际使用的RAM的公式是总计 – (free + buffers + cached) ,在你的情况下是3988 – (219 + 165 + 1894) ,换句话说是3988 – 2278 。 这是1710兆字节的RAM使用和2278兆字节的RAM仍然消耗。
不要相信我? 看,你的服务器甚至没有任何交换使用。 🙂
但是,当然,机器崩溃 – 如果你的意思是硬locking – 是一件奇怪的事情。 那真的不应该发生。 我怀疑有一个错误的RAM棒,只有在使用大于2 GB的RAM时才能访问它。
我只看到较老的CPU选项,所以我怀疑你只有一个32位的CPU,但是你应该可以使用所有的4GB,尽pipe你可能需要研究如何使你的工作方式(可能需要启用PAE,例如)。
你的意思是Java应用程序崩溃,或整个机器? 机器不应该崩溃(尽pipe它可能会变得没有响应)。
只是一个说明 – math中有一个错误。
(25* ~46KB = ~1MB) (25* ~46000KB = ~1150MB)应该读作(25* ~46000KB = ~1150MB) 。
资源的大小更重要,因为它可以为每个进程提供更真实的内存读取。
(25*~5000KB = ~125MB)