我对 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 需要花费大量时间从操作系统分配内存,然后很快再次释放内存。