我正在使用以下命令运行 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
即使物理内存未满,内存管理器也会根据它认为最好的方式自动将内容放入交换中。您是否有理由根本不希望它进入交换?真的会影响程序的运行吗?
您需要关闭交换才能测试有或没有交换的速度。
另外,它什么时候使用交换?一直运行还是运行一段时间后?您还必须考虑到底层系统也需要内存。以及您正在使用的任何 IDE,以及正在运行的任何其他程序。因此,您可能需要交换比您意识到的更多。
您系统上的整体内存消耗看起来不错。请记住从“已使用”部分中减去“缓存”和“缓冲区”以获得准确的可用内存量。高速缓存用于在 ram 中缓存文件,以备将来访问。如果 Linux 需要更多内存,它会简单地减少这个内存量,所以在确定内存利用率时一般不会考虑使用它。由于缓存池中有 6 GB,因此如有必要,有大量可用的 ram。
各个过程看起来也很好。Res 列表示实际允许的额定内存大小,似乎接近指定的堆大小。virt 列仅表示进程可以寻址的 ram 数量,而不是在该点上分配的内存。
您只使用了 70MB 的交换空间。
操作系统的内存管理器可以把东西放在它认为最好的地方。如果您希望它避免使用交换空间,则需要将其关闭。
有关. _ _
swapoff
这是 Linux 内存管理的设计方式。这是一种性能优化,它将原本为空(因此被浪费)的内存放入缓存数据中,否则这些数据可能需要从文件系统中再次读取。
尽管这似乎是一种不整洁的工作方式,但它更快。一旦可以更好地使用,操作系统就可以有效地回收这些内存。