![Linux下java内存分配](https://linux22.com/image/502585/Linux%E4%B8%8Bjava%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D.png)
我正在使用以下命令运行 4 个 java 进程:
java -Xmx256m-jar ...
并且系统在 Fedora 12 下有 8Gb 内存。
然而它显然正在进入交换阶段。
如果 4 x 256m = 1Gb,那怎么可能呢?
编辑:此外,既然分配给基本上唯一运行的程序的内存这么少,怎么能用完所有 8Gb 内存呢?
是不是因为操作系统告诉 Java 不需要进行垃圾收集,还是其他什么原因?
顶部:
top - 20:13:57 up 3:55, 6 users, load average: 1.99, 2.54, 2.67
Tasks: 251 total, 6 running, 245 sleeping, 0 stopped, 0 zombie
Cpu(s): 50.1%us, 2.9%sy, 0.0%ni, 45.1%id, 1.1%wa, 0.0%hi, 0.8%si, 0.0%st
Mem: 8252304k total, 8195552k used, 56752k free, 34356k buffers
Swap: 10354680k total, 74044k used, 10280636k free, 6624148k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1948 xxxxxxxx 20 0 1624m 240m 4020 S 96.8 3.0 164:33.75 java
1927 xxxxxxxx 20 0 139m 31m 27m R 91.8 0.4 38:34.55 postgres
1929 xxxxxxxx 20 0 1624m 200m 3984 S 86.2 2.5 183:24.88 java
1969 xxxxxxxx 20 0 1624m 292m 3984 S 65.6 3.6 154:06.76 java
1987 xxxxxxxx 20 0 137m 29m 27m R 28.5 0.4 75:49.82 postgres
1581 root 20 0 159m 18m 4712 S 22.5 0.2 52:42.54 Xorg
2411 xxxxxxxx 20 0 309m 9748 4544 S 20.9 0.1 45:05.08 gnome-system-mo
1947 xxxxxxxx 20 0 137m 28m 27m S 13.3 0.4 44:46.04 postgres
1772 xxxxxxxx 20 0 135m 25m 25m S 4.0 0.3 1:09.14 postgres
1966 xxxxxxxx 20 0 137m 29m 27m S 3.0 0.4 64:27.09 postgres
1773 xxxxxxxx 20 0 135m 732 624 S 1.0 0.0 0:24.86 postgres
2464 xxxxxxxx 20 0 15028 1156 744 R 0.7 0.0 0:49.14 top
344 root 15 -5 0 0 0 S 0.3 0.0 0:02.26 kdmflush
1 root 20 0 4124 620 524 S 0.0 0.0 0:00.88 init
2 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0
4 root 15 -5 0 0 0 S 0.0 0.0 0:00.04 ksoftirqd/0
答案1
即使物理内存未满,内存管理器也会根据其认为的最佳情况自动将内容放入交换区。您有什么理由不想让内容进入交换区吗?这实际上会影响程序的运行吗?
您需要关闭交换才能测试有或没有交换的速度。
另外,什么时候使用交换?是持续使用还是运行一段时间后使用?您还必须考虑到底层系统也需要内存。以及您正在使用的任何 IDE 和正在运行的任何其他程序。因此,您可能需要的交换可能比您意识到的更多。
答案2
系统上的整体内存消耗看起来不错。请记住从“已用”部分中减去“缓存”和“缓冲区”,以获得准确的可用内存量。缓存用于将文件缓存在 RAM 中,以备将来访问。如果 Linux 需要更多内存,它只会减少此内存量,因此在确定内存利用率时,您通常不会考虑已用内存。由于缓存池中有 6 GB,因此在必要时有足够的 RAM 可用。
各个进程看起来也不错。Res 列表示实际允许的额定内存大小,这似乎接近指定的堆大小。virt 列仅表示进程可以寻址的 RAM 数量,但不一定在此时分配。
答案3
如何才能使用全部 8Gb 内存,而只为运行一项功能分配这么少的内存?
这是 Linux 内存管理的设计方式。它是一种性能优化,将原本空着的内存(因此被浪费)用于缓存可能需要从文件系统再次读取的数据。
虽然这看起来似乎是一种不整洁的工作方式,但它速度更快。操作系统可以尽快高效地回收这些内存,以便更好地利用它们。
答案4
您仅使用了 70MB 的交换空间。
操作系统的内存管理器可以将内容放在它认为最佳的位置。如果您希望它避免使用交换空间,则需要将其关闭。
看http://linux.about.com/library/cmd/blcmdl8_swapoff.htm了解详情swapoff
。