Java应用程序的内存使用情况

4

关于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个回答

3
通过参数-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永久代,因此最小的操作系统进程大小将约为600-650 MiB。

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

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

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

在这里,最小值为8 GiB堆,512 MiB perm gen,因此最小的操作系统进程大小将约为8.6 GiB-基本上就是您看到的。
使用最大值,进程大小将达到近11 GiB。

谢谢Mikaveli。你的回答提供了非常好的关于内存的信息。我一定会减小最小内存的大小并尝试。但我的问题是如何有效地释放未使用的内存(没有任何问题),以便其他进程可以使用它。 - vivek4348
一旦分配了堆空间(最多到 -Xmx),它通常不会将内存释放回操作系统。相反,只需尽量不要分配超过应用程序所需的内存 - 在您的情况下,您分配了比必要多6-8 GiB的内存,这些内存可以被其他进程使用。 - Michael
昨天我看了一些文章...你是对的...它不会将内存释放回操作系统。感谢你的帮助。 - vivek4348
不用客气。如果您觉得我的回答有用,可以点击投票计数下面的勾选标志来“接受”我的答案。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接