我们的 linux 服务器上有 4GB,但我们目前只能使用 ~1.8GB 用于我们的 java 服务器,这是下面列出的第一个 java 进程。(200 MB 是免费的,所以我们可以最大使用 1.6GB + 0.2GB)
当我们使用更多时,机器会崩溃。所以我们指定 -Xmx1600m 和 -XX:MaxPermSize=200m 将服务器 RAM 限制为 1.8GB。但是我们需要更多的内存!剩下的内存去哪儿了?
这是根据内存使用情况排序的 top 程序输出(通过大“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
Run Code Online (Sandbox Code Playgroud)
如您所见,有很多(甚至更多)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
Run Code Online (Sandbox Code Playgroud)
我的错误在哪里?我可以调整服务器以给 java 进程更多的内存吗?
顺便说一句:我们没有使用像这里这样的虚拟机
更新
正如评论中指出的那样:它只是一个 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
...
Run Code Online (Sandbox Code Playgroud)
这是另一个非常相似的问题。
Jan*_*nen 10
啊,我看到你弄错了如何计算 Linux 中的可用 RAM。
Linux 倾向于通过缓存来大量利用所有 RAM。它不是每次都从磁盘读取目录列表,而是将目录条目缓存在 RAM 中。它缓存了经常使用的文件,因此不需要每次都从磁盘加载它们。如果某些进程确实需要 RAM 以供使用,则缓存将立即被逐出。
因此,计算实际使用的 RAM 的公式是total - (free + buffers + cached),在您的情况下为3988 - (219 + 165 + 1894)或换句话说3988 - 2278。即1710兆字节的 RAM 正在使用中,还有2278兆字节的 RAM 供您使用。
不相信我?看,您的服务器甚至没有使用任何交换。:)
但是当然,机器崩溃——如果你的意思是硬锁定——是一件奇怪的事情。那真的不应该发生。我怀疑一个有故障的 RAM 棒,只有在使用 >2 GB 的 RAM 时才能访问它。
| 归档时间: |
|
| 查看次数: |
2381 次 |
| 最近记录: |