【问题标题】:Regarding memory usage of Java Application关于Java应用程序的内存使用
【发布时间】:2012-10-05 20:57:01
【问题描述】:

我有一个关于 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。

【问题讨论】:

    标签: java tomcat memory jvm


    【解决方案1】:

    使用参数-Xms8192m,您是在告诉 Tomcat(嗯,JVM)在启动时分配至少 8 GiB 的堆空间。

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

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

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

    另外,请注意,进程大小将始终大于堆大小,因为它还包括永久生成空间 (-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。

    【讨论】:

    • 感谢 Mikaveli.. 您的回复提供了非常好的内存信息。我肯定会减少最小内存的大小并尝试..但我的问题是如何让操作系统有效地释放未使用的内存(没有任何问题),以便其他进程可以使用它..
    • 一旦分配了堆空间(直到-Xmx),它通常不会将内存释放回操作系统。相反,请尽量不要分配超过您的应用程序将使用的内存 - 在您的情况下,您分配的内存超出了必要的 6 - 8 GiB,这可能会被其他进程使用。
    • 我昨天浏览了一些文章..你是对的..它不会将内存释放回操作系统。谢谢你的帮助..
    • 不客气。如果您觉得有用,请随时“接受”我的回答(通过单击计票下方的勾号)。
    猜你喜欢
    • 2011-05-22
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多