相关疑难解决方法(0)

有没有办法在不使用时降低Java堆?

我目前正在研究Java应用程序并努力优化其内存使用.据我所知,我正在遵循适当的垃圾收集指南.但是,即使不需要,我的堆似乎仍然处于最大大小.

我的程序每小时运行一次资源密集型任务,当一个人没有使用计算机时.此任务使用了相当大的内存块,但在任务完成后立即释放所有内存.NetBeans探查器显示内存使用情况如下所示:

Java程序内存使用情况

我真的很想在不使用时将所有堆空间都交还给操作系统.没有理由让我把它全部用掉,而程序甚至不会在至少一个小时内做任何事情.

这可能吗?谢谢.

java heap memory-management

51
推荐指数
3
解决办法
2万
查看次数

减少JVM中未使用的堆大小

这里这里已经有类似的问题,但是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如下:

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

只有Seri​​al 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)

编辑: …

java heap jvm heap-memory intellij-idea

6
推荐指数
1
解决办法
1804
查看次数

标签 统计

heap ×2

java ×2

heap-memory ×1

intellij-idea ×1

jvm ×1

memory-management ×1