4

我有一个关于 java web 应用程序的内存使用的问题..

在任务管理器中,Tomcat 服务似乎占用了 8,677,544,000 Bytes 的内存

在jvisualvm中,部署在那个tomcat下的java应用的内存使用情况如下

Heap: 
Used: 2,304,233,184 B
Size: 8,589,934,592 B
Max: 10,737,418,240 B

Permgen:
Used:  80,272,056 B
Size: 536,870,912 B
Max:  536,870,912 B

Tomcat 的 Service.bat 文件中的内存参数:

-Xms8192m;-Xmx10240m;-XX:PermSize=512m;-XX:MaxPermSize=512m

现在,我的问题是,无论我设置什么 MaxHeapFreeRatio,即使已用空间有时会缩小,可用空间也不会缩小。

谁能告诉我为什么会这样。有没有办法缩小可用空间,以便系统上运行的其他进程可以利用它?

我正在使用最新版本的 JDK 1.7 和 Tomcat 7。

4

1 回答 1

3

使用参数-Xms8192m告诉 Tomcat(嗯,JVM)在启动时分配至少 8 GiB 的堆空间。

JVisualVM 统计数据支持这一点,但也告诉您应用程序正在使用大约 2 GiB。

将启动值降低到较低的值(从 2 GiB 开始)。请注意,如果应用程序需要更多堆空间,您已经告诉它您最多可以使用 10 GiB -Xmx10240m,因此也可能值得将该值降低(可能为 4 GiB)。

显然,如果您开始获得 OOME,您将需要增加这些值,直到应用程序有足够的速度可以愉快地运行(假设没有内存泄漏等)。

另外,请注意,进程大小将始终大于堆大小,因为它还包括永久生成空间 ( -XX:MaxPermSize=512m) 和 JVM 本身的内部内存/库。


基本示例:

-Xms512m;-Xmx1536m;-XX:PermSize=64m;-XX:MaxPermSize=256m

这里的最小值是 512 MiB 堆,64 MiB perm gen,因此最小 OS 进程大小约为 600 - 650 MiB。

随着应用程序分配更多空间直至最大值(1.5 GiB 堆,256 MiB perm gen),我预计进程大小将达到约 2 GiB。

现在,如果我们使用您的值:

-Xms8192m;-Xmx10240m;-XX:PermSize=512m;-XX:MaxPermSize=512m

这里的最小值是 8 GiB 堆,512 MiB perm gen,因此最小 OS 进程大小约为 8.6 GiB - 几乎就是您所看到的。

使用最大值,进程大小将接近 11 GiB。

于 2012-10-06T09:30:40.910 回答