gpt4 book ai didi

java - 在运行时为 OS 释放 java 内存

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:10:32 25 4
gpt4 key购买 nike

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

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

我希望我的应用程序在不需要使用大内存时将内存释放给操作系统。我可以在运行时使用 Java 应用程序执行此操作吗?

我的意思是当我的应用程序需要使用 64MB 的 Ram 时,然后操作系统只给它 64MB,当它需要 2GB 的内存时,操作系统给它 2GB,之后它需要 64MB 的内存,然后操作系统再次只给它 64MB,我不希望它浪费 2000MB - 64MB = 1936MB。

我可以这样做吗?

最佳答案

我已经发布了我的测试结果over there .基本上,MaxHeapFreeRatio 并没有被每个 GC 实现所尊重,而且,更糟糕的是,似乎有必要有足够的堆 Activity 以便及时触发它,即。可能是您需要运行 2 次完整的 GC 才能真正将内存释放给操作系统。如果您有 X GB 的突发内存占用,那么您可能必须分配该数量的 1 或 2 倍才能触发堆缩小。或者您手动调用 System.gc()。

如果性能不是问题,内存占用才是最重要的,请尝试:

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

关于java - 在运行时为 OS 释放 java 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11919400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com