Linux下java内存分配

Linux下java内存分配

我正在使用以下命令运行 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

相关内容