减少 JVM 中未使用的堆大小

Posted

技术标签:

【中文标题】减少 JVM 中未使用的堆大小【英文标题】:Reduce Unused Heap size in JVM 【发布时间】:2016-11-12 17:40:37 【问题描述】:

here 和 here 类似地问过这个问题,但对 JVM 参数的更改都没有让我找到相同的解决方案。我只是想减少我的 JVM 未使用的堆大小,以便它更接近地反映实际使用情况(将其释放给操作系统)。我一直在使用 YourKit 来分析内存使用情况,它通常看起来像这样:

我在 Windows 7 64 位、8 GB RAM 上运行 intellIj IDEA Community Edition 64 位。我已经使用上面链接中提到的建议编辑了.vmoptions 文件:C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 14.1.5\bin\idea64.exe.vmoptions。第一个链接的答案实际上是错误的/过时的,但 2 cmets 链接到找到的文章 here 和 here 似乎很有希望。问题是,我已经尝试了所有提到的不同垃圾收集器,但仍然看到上面显示的类似(不完全相同)堆大小。

如何减少分配的堆大小(橄榄绿色)以更准确地反映实际使用情况(蓝色)?垃圾回收不应该降低堆大小,而不是像现在那样增加它。

我尝试如下配置我的idea64.exe.vmoptions:

根据上面的最后一个链接,它声称

只有 Serial GC 和 G1 将未使用的内存释放给操作系统

它甚至可以直观地显示堆是如何减少的。然而我没有运气,并尝试了以下所有方法:发生了什么事??

-XX:+UseSerialGC

-XX:-UseSerialGC

-XX:+UseG1GC

-XX:-UseG1GC

Both of the above together, with and without ("+/-")

-XX:-UseAdaptiveSizePolicy
-XX:-UseParallelGC

-XX:UseConcMarkSweepGC

-Xms128m
-Xmx750m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=225m
-XX:+UseG1GC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djsse.enableSNIExtension=false

-server
-Xms128m
-Xmx512m
-XX:MaxPermSize=250m
-XX:ReservedCodeCacheSize=150m
-XX:UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true

编辑:

重申为什么这不是重复的,另一个“答案”是 5 岁,甚至没有提到任何现代垃圾收集器。唯一有用的部分是 cmets 中的两个链接,它们指向要使用的不同 JVM 参数,所有这些我都尝试过但没有成功。我已经完全尝试了这些解决方案,但仍然没有结果。这正是我敦促您将其视为独一无二的原因,因为其他人可能正在经历同样的循环挫折。

【问题讨论】:

Is there a way to lower Java heap when not in use?的可能重复 哦,拜托,我在 4 天前已经阅读了该解决方案的每一个字。答案是 5 岁,并且没有提到任何现代垃圾收集器。我在我的问题中提到了那个链接,即使是附加到***解决方案的 2 cmets 也没有让我得到正确的结果。我准确地展示了我尝试过的内容(所有这些都来自假设为“重复”的链接,它是链接的文章)。这都包含在我的问题中,所以请不要简单地将我重定向到那个。在这个问题上花了一个星期就被解雇是一种侮辱。请重新考虑这是独一无二的。 非常抱歉 :-) 由于评论缺乏深度,我使用上面提到的测试类@Meo 对我的结果进行了简明的细分。我试图接触大家的建议,但是我无法弄清楚如何做上面提到的分配触发GC的用户“the8472”。我的目标是获得分配的堆大小以密切反映使用的大小,但我仍然无法。您能否帮助分析日志以识别我的问题?谢谢。可以在此处找到细分:scribd.com/document/318135964/Heap-Breakdown 我的结果docs.google.com/document/d/… 【参考方案1】:

据我所知,这些仅适用于编辑器本身。您应该在以下位置插入这些设置:

运行 > 编辑配置...> 虚拟机选项

如果放置在程序 vmoption 中,这些选项应该可以工作。

【讨论】:

这就是答案!马克,非常感谢你,认真的。这是我在您提到的VM选项中仅使用-XX:+UseG1GC的结果:i.imgur.com/SefifAH.png,这是我手动单击“Perform GC”i.imgur.com/3zlkT3N.png后实际程序的结果。您能否简要解释“那些仅适用于编辑器本身”的意思。那么idea64.exe.vmoptions 文件到底有什么用呢?此外,使用我的分布式 JAR 文件,最终用户分配的堆大小是否仍会减少?我假设launch4J可能会工作。再次感谢!! :) idea64.exe.vmoptions 仅适用于 IntelliJ IDE 本身。 JAR 文件本身没有 VM 选项,您必须提供正确的命令来运行它,例如带有“java -XX:+UseG1GC -jar lib/artifact.jar arg1 arg2”的 bat/sh 文件

以上是关于减少 JVM 中未使用的堆大小的主要内容,如果未能解决你的问题,请参考以下文章

如何减少 JVM 中的已提交堆内存

关于增加 JVM 的堆大小

JVM参数说明

Android中JVM的堆大小[重复]

用更大的堆空间重新启动 JVM

Java非常大的堆大小[关闭]