在运行时释放OS的java内存.

use*_*936 7 java jvm

假设我有一个Swings Java应用程序,我设置的最小堆是64MB,最大堆是2GB,当用户启动应用程序时,会显示登录界面,此时应用程序使用64MB,权限?从我的Windows 7中,我可以看到java应用程序从操作系统的内存资源监视器中分配了64MB(实际上,它超过64MB,因为JVM需要一些内存来完成它的任务).

之后,用户执行了一些非常繁重的工作,然后应用程序使用2G.然后用户注销应用程序,再次显示登录屏幕(应用程序尚未关闭).此时应用程序使用64MB的实际内存(假设这是完美的内存管理应用程序),但是对于OS这个应用程序仍在使用2G的RAM,我可以在OS的资源监视器上看到它.

我希望我的应用程序在不需要使用大内存时将内存释放到操作系统.我可以在运行时使用java应用程序吗?

我的意思是当我的应用程序需要使用64MB的Ram,那么操作系统只给它64MB,当它需要2GB的RAM然后操作系统给它2GB,之后它需要64MB的ram然后操作系统再给它64MB,我不要浪费2000MB - 64MB = 1936MB.

我能这样做吗?

谢谢,

Ste*_*n C 5

我希望我的应用程序在不需要使用大内存时将内存释放到操作系统.我可以在运行时使用java应用程序吗?

不,你不能.

在某些情况下,GC会自行将内存释放回操作系统,但我不知道任何允许应用程序告诉GC执行此操作的JVM.最重要的是,GC在这方面相当保守,因为......作为一般规则...... JVM将以更多内存更高效地运行,并且不断地向OS请求/回馈内存是低效的.


请注意,GC调整选项-XX:MaxHeapFreeRatio可用于指定GC将释放内存之前的可用堆的最大比率.但是,有并发症.例如,并非所有可用的GC都遵循此选项.如果你打算尝试这种方法,我建议你做一些研究......不要指望奇迹.


use*_*755 5

在那里发布了我的测试结果.基本上,MaxHeapFreeRatio不受每个GC实现的尊重,并且,为了使其更糟糕,似乎有必要存在足够的堆活动以便及时触发它,即.可能是你需要2次完整的GC运行来实际释放内存到操作系统.如果你有一个X GB的突发内存占用,那么你可能需要分配该数量的1或2倍才能触发堆缩小.或者您手动调用System.gc().

如果性能不是问题,并且内存占用非常重要,请尝试:

-XX:UseSerialGC -Xms16M -Xminf=5 -Xmaxf=10
Run Code Online (Sandbox Code Playgroud)


And*_*son 1

您可以处置对象并建议垃圾收集器执行其工作,但如果 GC 认为没有必要,则该请求将被忽略。总而言之,“不”。

请注意分配给 Java 应用程序的内存。在应用程序之前设置。启动,并且不可调整。