我对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。