我对Java Web应用程序的内存使用有疑问。

在任务管理器中,Tomcat服务似乎占据了 8,677,544,000 内存字节

在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。

最佳答案

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

JVisualVM统计信息支持该功能,但还告诉您该应用程序正在使用大约2 GiB。

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

显然,如果您开始获得OOME,则需要增加这些值,直到应用程序具有足够的运行能力(假设没有内存泄漏等)为止。

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

基本示例:

-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,因此最小操作系统进程大小约为8.6 GiB-几乎与您所看到的完全一样。

使用最大值,过程大小将达到近11 GiB。

09-16 06:43