了解 Linux 上的 RAM 使用情况

了解 Linux 上的 RAM 使用情况

我对 Linux 完全陌生,只是想了解我的 RAM 都用在哪儿了。我刚刚安装了 Xubuntu,作为 VMWare 客户端运行,我给它分配了 1.5GB RAM 来玩。

仅运行了两个应用程序、启动了 Tomcat 服务器并运行了 Firefox 之后,几乎没有剩余空间了。根据 free -m,为 160MB。

查看 Top 的输出,我发现 Java 出现了两次,每次都窃取了大约 1/2 Gig 的常驻内存。两个 Tomcat 实例都使用相同的 jdk,我原以为只会在那里看到一次 Java。

发生了什么?

更新

请求的 free -m 输出:

             total     used     free    shared    buffers    cached
Mem:          1419     1380       39         0          8       111
-/+ buffers/cache:     1259      160       
Swap:          509       68      441

顶部:

    VIRT   RES   SHR   %MEM   COMMAND
   74764   36m  6032    2.6   Xorg
    750m  500m  3436   35.5   java
    881m  408m   10m   28.8   java
    6128  1876  1588    0.1   vmtoolsd
   26156  3408  2672    0.2   vmware-user-load
    409m  104m   15m    7.4   firefox-bin
    2632  1060   776    0.1   top
    3032  1264   812    0.1   init
    All zeroes after here.

答案1

这不是 Linux 的问题,而是 Java 的问题(完全正常)。Windows 上也会发生同样的情况,不过我猜 Windows 可能更愿意交换部分 Tomcat 进程。

首先,两个 Tomcat 实例将在两个单独的进程中启动两个 JVM 实例。问题是您是否真的需要两个 Tomcat 实例。您可以轻松在同一个实例中运行两个不同的 Web 应用程序。

其次,Java 作为一种基于垃圾收集的语言,喜欢使用大量内存,并且倾向于使用允许使用的最大堆的很大一部分,因为这样它在垃圾收集方面总体上做的工作就更少了。它也不会将未使用的内存返还给操作系统,因为它可能很快会再次需要它。

如果您确定您的 Web 应用程序需要的内存远少于半 GB,则可以通过在 catalina.sh 中将环境变量 CATALINA_OPTS 设置为“-Xmx256m”以使其最大堆为 256MB,从而以较小的最大堆启动 Tomcat。如果您的应用程序有时需要更多内存,但您希望它更快地缩小其堆,请将其设置为“-XX:MaxHeapFreeRatio=20 -XX:MinHeapFreeRatio=10” - 如果垃圾收集后有超过 20% 的堆是空闲的,这将把内存返还给操作系统,如果空闲的堆不到 10%,则扩展堆。但这可能会降低性能,因为 Java 需要花费大量时间从操作系统分配内存,然后很快再次释放内存。

相关内容