jvm 在运行时为操作系统释放java内存

ncecgwcz  于 2022-11-23  发布在  Java
关注(0)|答案(5)|浏览(286)

假设我有一个Swings Java应用程序,我将最小堆设置为64 MB,最大堆设置为2GB,当用户启动应用程序时,将显示登录屏幕,此时应用程序使用64 MB,对吗?在我的Windows 7中,我可以看到操作系统的内存资源监视器为Java应用程序分配了64 MB(实际上,它超过了64 MB,因为JVM需要一些内存来完成它任务)。
之后,用户执行一些非常繁重的工作,然后应用程序使用2G。然后用户注销应用程序,再次显示登录屏幕(应用程序尚未关闭)。此时应用程序正在使用的实际内存为64 MB(假设这是完美的内存管理应用程序),但使用操作系统时,此应用程序仍使用2G的RAM,我可以在操作系统的资源监视器上看到它。
我希望我的应用程序在不需要使用大内存的时候释放内存给操作系统。我可以在运行时用java应用程序这样做吗?
我的意思是,当我的应用程序需要使用64 MB的RAM时,操作系统只给它64 MB,当它需要2GB的RAM时,操作系统给它2GB,之后它需要64 MB的RAM,操作系统再给它64 MB,我不希望它浪费2000 MB-64 MB = 1936 MB。
我可以这样做吗?

8dtrkrch

8dtrkrch1#

我已经发布了我的测试结果over there。基本上,MaxHeapFreeRatio并不是每个GC实现都遵守的,而且,更糟糕的是,似乎有必要有足够的堆活动来及时触发它,也就是说,可能需要运行两次完整的GC才能将内存真正释放给操作系统。如果您有X GB的突发内存占用,那么您可能必须分配1或2倍于该数量的内存才能触发堆的缩减,或者手动调用System.gc()。
如果性能不是问题,内存占用才是最重要的,请尝试:

-XX:UseSerialGC -Xms16M -Xminf=5 -Xmaxf=10
disbfnqx

disbfnqx2#

我希望我的应用程序在不需要使用大内存的时候释放内存给操作系统。我可以在运行时用java应用程序这样做吗?
不,你不能。
在某些情况下,GC会自动将内存释放回操作雅阁,但我不知道有哪个JVM允许应用程序告诉GC这样做。最重要的是,GC在这样做时相当保守,因为......作为一般规则...... JVM使用更多内存会运行得更高效,而不断地向操作系统请求/归还内存是低效的。
请注意,在GC给予内存之前,可以使用GC调优选项-XX:MaxHeapFreeRatio来指定可用堆与已用堆的最大比率。然而,这也有复杂性。例如,并非所有可用的GC都遵守此选项。如果您打算尝试此方法,我建议您做一些研究......不要期待奇迹。

k2fxgqgv

k2fxgqgv3#

hotspot中的serialgc会归还内存...至少以前是这样的。你的性能会直线下降。
IBM J 9 JVM中的所有垃圾收集器都将释放内存。我不确定这个JVM是否可以免费下载...
最好的答案是,你为什么要担心呢?现在内存非常便宜,空闲内存就是浪费内存。这 * 真的 * 是个问题吗?操作系统会将多余的未使用内存分页到磁盘。最好的答案是忽略它。:)
您还可以考虑在Google上搜索堆外存储,也许是Teracotta/eh缓存。
编辑:
我刚刚注意到,在JDK1.7u6中,使用带有小Xms和大Xmx的G1 GC时,垃圾收集器将在几次垃圾收集(其中释放了多余的对象)后减小堆的大小。

moiiocjp

moiiocjp4#

你可以释放对象并建议垃圾收集器完成它的工作,但是如果GC认为没有必要,那么这个请求将被忽略。所以总的来说,“no”。
请注意,分配给Java应用程序的内存是在应用程序启动前设置的,不可调整。

iecba09b

iecba09b5#

尝试将部分代码分叉到一个单独的线程中,并在不再需要时将其丢弃。

相关问题