进程可以与其他进程共享未使用的内存吗?

进程可以与其他进程共享未使用的内存吗?

我想在实验中运行大约 200 个进程。他们每个人确实需要少于一个GB

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
24688 rinkman   20   0 6082416 335536  15680 S 116.9  0.3  77:32.92 java
25314 rinkman   20   0 6614936 379040  15700 S 116.6  0.4  73:43.02 java
25780 rinkman   20   0 6082408 348140  15664 S 116.6  0.4  72:12.34 java
25994 rinkman   20   0 6082408 350592  15656 S 114.6  0.4  71:42.34 java
30472 rinkman   20   0 6749092 441492  15664 S 108.6  0.4  64:54.38 java
27052 rinkman   20   0 6548364 403040  15692 S 106.3  0.4  66:38.30 java
29314 rinkman   20   0 6022012 393656  15660 S 105.0  0.4  65:57.09 java
28173 rinkman   20   0 6681492 427816  15660 S 104.3  0.4  66:17.47 java

我可以访问 6 个节点100 GB每个 RAM 的数量。所以如果他们只采取一个GB,没有任何问题。但是,正如您在上面看到的,每个人都需要超过6GB

当我查看以下输出时,我感到非常惊讶free -m

              total        used        free      shared  buff/cache   available
Mem:          96481       15396         326          75       80758       80448
Swap:         16383        2336       14047

它仅显示15.4GB用过的。这让我想到,进程可以共享未使用的内存吗?是80.4GB实际可用吗?不幸的是,我无法通过谷歌搜索有趣的信息。我只是偶然发现了有关多处理/线程与数据交换、公共缓存等的文章。拜托,你能为我解答一下这个问题吗?

聚苯乙烯如果这是不可能的,有什么方法可以减少为这些进程分配的内存(我刚刚从 200 个进程中只运行了 8 个)?问题在于 bash 脚本仅提供2GB为了爪哇(这是一部分):

java -Xms64m -Xmx2048m -Djava.library.path="$BEAST_LIB:/usr/local/lib:$LD_LIBRARY_PATH" -cp "$BEAST_LIB/beast.jar:$BEAST_LIB/beast-beagle.jar" dr.app.beast.BeastMain $*

所以我无法理解为什么它总是需要4-5GB更多的。我在其他Java程序中也有同样的现象,例如,野兽2或者树注释器

答案1

看来你读错了。

第一列是VIRT,它无关紧要,在大多数情况下应该完全忽略。

您感兴趣的是RSS,您的每个进程的 RAM 都在半千兆以下。你做的不错。

现在回答你的问题。

不存在共享“未使用”内存之类的事情,它要么已使用,要么未使用。一些内存确实是共享的,这是第三列,称为SHR。这就是共享库的内存。如果我没记错的话,Linux 内核早已停止计算/显示正确的值,因为它非常复杂。

PS 说实话,我不知道为什么 Linux RAM 实用程序(tophtopfree等)显示 VIRT 列。我从未使用过或关注过它,也没有见过任何人这样做。

相关内容