我正在使用一个 Play 框架 Web 应用程序调用 Web 服务,所有这些应用程序都部署在一个 tomcat/apache 服务器中,在生产环境中,tomcat 会启动多个进程,这些进程占用相同的 MEM%,可以通过 top 命令进行验证。服务器刚启动时,大约有 15 个进程占用了 22% 的 MEM(800m RES),当应用程序启动时,进程数会增加到大约 30-35 个进程。
如您所见,RES(常驻内存使用量)为 880MB 到 1.2 Gig,而分配给 tomcat 的最大内存为 256 MB,使用 -XX:PermSize=256m -XX:MaxPermSize=256m
此 tomcat 实例中总共部署了 3 个 Web 应用程序 war 和 3 个服务 war
请解释如何减少此应用程序的内存使用量和进程???
服务器启动后
顶部 - 01:33:42 启动 59 天,1 分钟,11 个用户,平均负载:4.76、4.49、3.29 任务:总计 1496 个,其中 1 个正在运行,1493 个正在休眠,0 个已停止,2 个僵尸 CPU:31.3%us、1.9%sy、0.0%ni、64.8%id、1.0%wa、0.2%hi、0.8%si、0.0%st 内存:总计 3759600k,已使用 3707492k,可用 52108k,缓冲区 57912k 交换:总计 6313480k,已使用 3353744k,可用 2959736k,缓存 155216k
PID 用户 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令
23070 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java
23071 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java
23072 分辨率 20 0 1330m 931m 9316 S 0 25.4 3:29.07 java
23073 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:06.84 java
23074 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:06.98 java
23075 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:28.86 java
23076 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.04 java 23077 分辨率 20
0 1330m 931m 9316 S 0 25.4 0:00.16 java
23078 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java
23079 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:55.73 java
23080 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:52.07 java
23081 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 23082 分辨率 20 0 1330m
931m 9316 S 0 25.4 0:00.12 java
23083 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java
23085 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java
23647 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java
23883 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 23885 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 23887 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java
23893 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 24114 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 24122 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 24123 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 24126 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 24354 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 24375 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 24778 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 24843 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 25059 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 25069 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.04 java 25070 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 25071 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:02.62 java 25072 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.86 java 25073 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.40 java 25076 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 25077 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java
25078 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java
25079 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java
25080 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java
25559 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 25560 分辨率
20 0 1330m 931m 9316 S 0 25.4 0:00.00 java
25561分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java
25562 分辨率 20 0 1330m 931m 9316 S 0 25.4 0:00.00 java 17792
分辨率 20 0 86728 6376 1716 S 1 0.2 2:06.83 python
17793 分辨率 20 0 86728 6376 1716 S 0 0.2 0:00.04 python
17794 分辨率 20 0 86728 6376 1716 S 0 0.2 0:07.62 python
25340 分辨率 20 0 2868 1840 768 R 1 0.0 0:01.02 顶部
17791 分辨率 20 0 13724 1428 1428 S 0 0.0 0:00.14 python
答案1
这实际上不是 Tomcat 的问题,而是 (Oracle) JVM 的问题。MaxPermSize 设置永恒的代用于类加载,然后是通常较大的堆。这(加上本机内存)就是使用剩余内存的。
例如这篇博文