减少 JVM 中未使用的堆大小

Reduce Unused Heap size in JVM

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

我是 运行 intellIj IDEA Community Edition 64 位,Windows 7 64 位,8 GB RAM。我已经根据上面 link 中提到的建议编辑了此处找到的 .vmoptions 文件:C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 14.1.5\bin\idea64.exe.vmoptions。第一个 link 的答案实际上是 wrong/out-dated,但是对 here and here 找到的文章的 2 条评论 link 看起来很有希望。问题是,我已经尝试了所有提到的不同垃圾收集器,但仍然看到上面显示的类似(不相同)堆大小。

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

我试过按如下方式配置我的 idea64.exe.vmoptions:

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

Only the Serial GC and G1 release unused memory to the OS

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

-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

编辑:

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

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

Run > Edit Configurations... > VM options

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