jvm会释放内存吗?

问题描述 投票:0回答:1

我是一名Java开发人员,使用jdk 1.8。我的应用程序在 k8s 中运行。每个 Pod 的内存限制为 2.5g。当我的应用程序运行一段时间后,会发生full gc,但内存不会被释放。

我的jvm配置如下

 -Xmx2048m -Xms2048m -Xmn256m -XX:PermSize=128m -Xss256k  -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70
当我的应用程序运行一段时间后,堆内存将达到2048m。执行gc后,整个pod占用的内存不会减少。这会导致一些不好的情况。整个 Pod 的内存将超过 2.5G 限制。 K8s pod会重启,会导致应用暂时不可用。 是不是因为我的xms和xmx配置为一样大小,导致gc后内存没有被回收? 我希望得到你的帮助。谢谢!

java jvm jvm-hotspot jvm-arguments jvm-crash
1个回答
0
投票

你想要的称为内存未提交或堆未提交。

你有几个选择,如果你想继续使用当前的垃圾收集器,你可以手动调用

System.gc()
,它应该取消提交你的内存,将其返还给操作系统。

最简单的方法是使用 Shenandoah 垃圾收集器,您可以通过提供

-XX:+UseShenandoahGC
标志来实现。

堆取消提交。许多 GC 在认为这是一个好主意时已经执行了堆取消提交:Shenandoah 即使没有 GC 请求也会异步执行此操作,G1 肯定会在显式 GC 请求上执行此操作,非常肯定串行和并行在某些情况下也会执行此操作。

该引用的博客文章来源https://shipilev.net/jvm/anatomy-quarks/21-heap-uncommit/

这里是 openjdk 网站上有关 Shenandoah 的更多信息(搜索“uncommit”)https://wiki.openjdk.org/display/shenandoah/Main

© www.soinside.com 2019 - 2024. All rights reserved.