如何解决垃圾收集器Java应用程序无法释放POD Kubernetes中的内存
我的应用程序的垃圾收集器有问题,我正在使用Kubernetes和BigTable作为数据源的GCP环境中工作。
在接收到负载后,应用程序不会释放内存空间并填满,直到k8s重新启动POD。我使用探查器查看JVM的行为,这就是结果。
在“旧一代”池中,可以看到内存已满,但它从不释放空间,直到第一次重新启动并重新开始,它才会填满。
在“ Eden Space”池中,可以看到它正在填充时释放了空间,从未达到极限。
这是创建docker映像以将其部署在k8s中时的JVM配置。
java
-XX:+UnlockExperimentalVMOptions
-XX:+UseG1GC
-XX:+UseCGroupMemoryLimitForHeap
-XX:+AlwaysPreTouch
-XX:ParallelGCThreads=5
-XX:GCTimeRatio=4
-XX:MaxGCPauseMillis=100
-XX:MinHeapFreeRatio=30
-XX:MaxHeapFreeRatio=30
-Xms512m
-Xmx4608m
此配置已应用到另一个进行REST调用的应用程序中,并且从未遇到过这种情况下的内存填充问题。
Java版本为1.8
感谢您的帮助。
礼物。
解决方法
首先,您必须确定问题的根本原因才能继续进行。我建议您使用-XX:+ PrintGCDetails和-XX:+ PrintGCTimeStamps收集有关该主题的更多信息。如果您关于“老一代”池永远不会释放空间的假设是正确的(老实地说,从图片中不明显),那么您可以运用一些技巧来处理它:
- 通过-XX:MaxNewSize,-XX:NewSize,-XX:MaxOldSize,-XX:MaxOldSize直接指定新旧gc大小,以确保有足够的空间供旧一代使用
- 通过-XX:+ PrintGCDetails和-XX:+ PrintGCTimeStamps收集更多日志,以查看是否由于使用了其中一个世代而发生任何问题
- 尝试通过-XX:SurvivorRatio增加幸存者空间比率,以加快旧对象的收集速度
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。