关于Java应用程序的内存使用

关于Java应用程序的内存使用,java,tomcat,memory,jvm,Java,Tomcat,Memory,Jvm,我有一个关于java web应用程序内存使用的问题 在任务管理器中,Tomcat服务似乎占用了8677544000字节的内存 在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 T

我有一个关于java web应用程序内存使用的问题

在任务管理器中,Tomcat服务似乎占用了8677544000字节的内存

在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什么,自由空间都不会缩小,即使使用的空间有时会缩小

谁能告诉我为什么会这样。。有没有办法缩小可用空间,以便系统上运行的其他进程可以利用它


我正在使用JDK1.7和Tomcat 7的最新版本。

参数
-Xms8192m
告诉Tomcat(JVM)在启动时分配至少8Gib的堆空间

JVisualVM统计数据支持这一点,但也告诉您应用程序正在使用大约2 GiB

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

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

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


基本示例:

-Xms512m;-Xmx1536m;-XX:PermSize=64m;-XX:MaxPermSize=256m
这里的最小值是512 MiB heap,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。

感谢Mikaveli。。你的回答提供了很好的记忆信息。我一定会减少最小内存的大小并尝试。。但是我的问题是如何让操作系统有效地释放未使用的内存(没有任何问题),以便其他进程可以使用它。一旦分配了堆空间(直到
-Xmx
),它通常不会将内存释放回操作系统。取而代之的是,尽量不要分配超过你的应用程序将要使用的资源——在你的情况下,你分配的资源比需要的多6-8 GiB,这可能会被其他进程使用。我昨天浏览了一些文章。。你是对的。它不会将内存释放回操作系统。谢谢你的帮助,不客气。如果您觉得我的答案有用,请随时“接受”我的答案(通过单击计票下的勾号)。