我们的 Linux 服务器上有 4GB,但目前我们只能为我们的 Java 服务器使用约 1.8GB,这是下面列出的第一个 Java 进程。(200 MB 是免费的,因此我们最多可以使用 1.6GB + 0.2GB)
当我们使用更多内存时,机器会崩溃。因此我们指定了 -Xmx1600m 和 -XX:MaxPermSize=200m,将服务器 RAM 限制为 1.8GB。但我们需要更多 RAM!剩余的 RAM 去哪儿了?
以下是按内存使用情况排序的程序输出(通过大“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)。所以我至少只能使用 3GB?但服务器本身似乎是 64 位的?因为输出中的 lm(长模式)?
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
...
这里是另一个非常相似的问题。
答案1
啊,我看你搞错了如何计算 Linux 中的可用 RAM。
Linux 倾向于通过缓存内容来充分利用所有 RAM。它不是每次都从磁盘读取目录列表,而是将目录条目缓存在 RAM 中。它缓存常用文件,因此不需要每次都从磁盘加载它们。如果某个进程确实需要 RAM 来使用,则将立即清除缓存。
因此,计算实际使用的 RAM 的公式是总计 - (可用 + 缓冲区 + 缓存),就你的情况而言3988 - (219 + 165 + 1894)或者换句话说3988 - 2278。 那是1710使用的 RAM 兆字节数和2278您仍可使用 2000 兆字节的 RAM。
不相信吗?瞧,你的服务器甚至没有使用任何交换空间。:)
但当然,机器崩溃(如果你指的是硬锁)是一件奇怪的事情。这真的不应该发生。我怀疑是内存条有问题,只有在使用超过 2 GB 的内存时才会被访问。
答案2
我只看到较旧的 CPU 选项,因此我怀疑您只有一个 32 位 CPU,但您应该能够使用全部 4GB,尽管您可能需要研究如何使其按照您想要的方式工作(例如,可能需要启用 PAE)。
你的意思是 Java 应用程序崩溃,还是整个机器崩溃?机器不应该崩溃(尽管它可能暂时没有响应)。
答案3
请注意-数学上有一个错误。
(25* ~46KB = ~1MB)
应读作(25* ~46000KB = ~1150MB)
。
资源大小更为重要,因为它为每个进程提供了更真实的内存读数。
(25*~5000KB = ~125MB)