我目前正在研究Java应用程序并努力优化其内存使用.据我所知,我正在遵循适当的垃圾收集指南.但是,即使不需要,我的堆似乎仍然处于最大大小.
我的程序每小时运行一次资源密集型任务,当一个人没有使用计算机时.此任务使用了相当大的内存块,但在任务完成后立即释放所有内存.NetBeans探查器显示内存使用情况如下所示:

我真的很想在不使用时将所有堆空间都交还给操作系统.没有理由让我把它全部用掉,而程序甚至不会在至少一个小时内做任何事情.
这可能吗?谢谢.
这里和这里已经有类似的问题,但是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条评论链接到这里和这里看起来很有希望的文章.问题是,我已经尝试了所提到的所有不同的垃圾收集器,并且仍然看到上面显示的类似(不相同)的堆大小.
如何减少分配的堆大小(橄榄绿)以更准确地反映实际使用情况(蓝色)?垃圾收集不应该降低堆大小,而不是像目前那样增加它.
我已经尝试配置我的idea64.exe.vmoptions如下:
根据上面的最后一个链接,它声称
只有Serial GC和G1将未使用的内存释放到OS
它甚至可以直观地显示堆的减少方式.然而,我没有运气,并尝试了以下所有方面:发生了什么?
-XX:+UseSerialGC
和
-XX:-UseSerialGC
和
-XX:+UseG1GC
Run Code Online (Sandbox Code Playgroud)
和
-XX:-UseG1GC
Run Code Online (Sandbox Code Playgroud)
和
Both of the above together, with and without ("+/-")
Run Code Online (Sandbox Code Playgroud)
和
-XX:-UseAdaptiveSizePolicy
-XX:-UseParallelGC
Run Code Online (Sandbox Code Playgroud)
和
-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
Run Code Online (Sandbox Code Playgroud)
和
-server
-Xms128m
-Xmx512m
-XX:MaxPermSize=250m
-XX:ReservedCodeCacheSize=150m
-XX:UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
Run Code Online (Sandbox Code Playgroud)
编辑: …