如果需要将内存归还给系统,解决方案,添加参数
-XX:GCTimeRatio=19 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=30
这个热点JVM是否将内存释放回操作系统,但这是不情愿的,因为调整堆的大小是很昂贵的,并且假设如果您需要该堆一次,您将再次需要它。
你可以通过设置-XX:GCTimeRatio=19 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=30
这将使它能够花费更多的CPU时间来收集和限制GC循环后分配但未使用的堆内存的数量。
假设您使用的是并发收集器,您也可以设置-XX:InitiatingHeapOccupancyPercent=N
使用N到一些低值使GC几乎连续地运行并发集合,这将消耗更多的CPU周期,但会更快地缩小堆。这,这个一般这不是一个好主意,但在一些有大量空闲CPU核但内存不足的机器上,这是有意义的。
如果使用带有默认暂停时间目标(CMS或G1)的收集器,也可以放宽该目标以减少对收集器的限制,或者可以切换Go并行收集器,以便在暂停时间内对足迹进行优先排序。
加上Java 9-XX:-ShrinkHeapInSteps
选项可用于更积极地应用前两个选项所造成的收缩。相关OpenJDK bug.
请注意,收缩能力和行为取决于所选的垃圾收集器。例如,G1只获得了返回堆中间未使用的块使用jdk8u20,而zgc使用还没支持它和epsilon收集器很可能永远不会。
因此,如果需要堆收缩,就应该测试特定的JVM版本和GC配置。
GC测井PrintAdaptiveSizePolicy
也可以提供洞察力,例如当JVM试图为年轻一代使用更多内存以实现某些目标时。
也有9月346,包含在OpenJDK 12中,它引入了G1GC的提示内存发布,G1PeriodicGCInterval
选项,同样以牺牲一些额外的CPU为代价。中还提到了类似的特性。谢南多而OpenJ9VM.