我对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。
答案 0 :(得分:2)
使用参数-Xms8192m
,您告诉Tomcat(以及JVM)在启动时分配至少8 GiB的堆空间。
JVisualVM统计数据支持这一点,但也告诉您应用程序正在使用大约2 GiB。
将启动值降低到较低值(从2 GiB开始)。请注意,如果应用程序需要更多堆空间,您已经告诉它最多可以使用10 GiB -Xmx10240m
,因此可能值得将此值减小(也可能为4 GiB)。
显然,如果你开始获得OOME,你需要增加值,直到应用程序足够快乐地运行(假设没有内存泄漏等)。
另请注意,进程大小始终大于堆大小,因为它还包括perm gen空间(-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。