JVM——问题——gc后内存没有归还给系统

 

如果需要将内存归还给系统,解决方案,添加参数

-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.

你可能感兴趣的:(jvm)