关于Java Application的内存使用情况

时间:2012-10-05 20:57:01

标签: java tomcat memory jvm

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

1 个答案:

答案 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。