垃圾收集器Java应用程序无法释放POD Kubernetes中的内存

埃里亚斯·巴尔加斯(Elias Vargas):

我的应用程序的垃圾收集器有问题,我正在使用Kubernetes和BigTable作为数据源的GCP环境中工作。

收到负载后,该应用程序不会释放内存空间,并且会填满,直到k8s重新启动POD。我使用探查器来查看JVM的行为,这就是结果。

在“旧一代”池中,可以看到内存已满,但是它从不释放空间,直到第一次重新启动后它才会填满。

老一代

在“ Eden Space”(伊甸园空间)游泳池中,可以看到它正在填充时释放了空间,从未达到极限。

伊甸园空间

This is the JVM configuration when creating the docker image to deploy it in k8s.

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

This same configuration is applied in another application that makes REST calls and has never had memory filling problems as in this case.

Java version is 1.8

Thankful for your help.

Grettings.

Alexander Makarov :

Firstly, you have to identify the root cause of your problem to proceed further. I would suggest you to collect more information on the topic with -XX:+PrintGCDetails and -XX:+PrintGCTimeStamps. If your hypothesis that "Old Gen" pool is never frees the space is correct (honestly spearking, it's not obvious from the image), you might apply few tricks to deal with it as such:

  • Directly specify new and old gc sizes via -XX:MaxNewSize, -XX:NewSize, -XX:MaxOldSize, -XX:MaxOldSize to ensure that there is enough space for old generation
  • 通过-XX:+ PrintGCDetails和-XX:+ PrintGCTimeStamps收集更多日志,以查看是否由于过度使用了其中一个世代而发生任何问题
  • 尝试通过-XX:SurvivorRatio增加幸存者空间比率,以加快旧对象的收集

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

垃圾收集器未释放Android应用程序中应释放的“垃圾存储”

垃圾收集器无法释放导致完全GC的JBoss 7.1.1上的内存

垃圾收集器无法在Java中工作?

会话对象会占用我的应用程序中的资源吗?垃圾收集器不会删除它们吗?

什么是Java中的垃圾收集器?

Golang垃圾收集器在1.5+中的改进会影响释放的内存量吗?

垃圾收集器如何在C#中释放内存

如何从Node.js中的垃圾收集器“释放”内存缓冲区?

为什么Net Core 2.0中的垃圾收集器不释放所有内存

Java垃圾收集器是否清理堆栈内存?

JAVA多线程,内存泄漏,垃圾收集器

使用R包装器时,R垃圾收集器是否释放C中分配的内存?

PHP内存限制垃圾收集器

Java - Java8 中的 JVM 垃圾收集器

在Java中滚动垃圾收集器日志

垃圾收集器尝试收集共享内存对象

Android中的垃圾收集器

如果我将null分配给对象或属性,C#中的垃圾收集器是否将始终运行并释放其内存空间?

Java垃圾收集:什么是并行收集器中的虚拟空间?

从控制台应用程序中收集的垃圾中保留计时器

Java G1垃圾收集器占用大量内存

Google I / O 2014视频中描述了收据收集器示例应用程序在哪里?

垃圾收集器不释放“鞭打记忆”,因为它应该在Android应用程序

如何在远程jmx URL的java中获取所有垃圾收集器MX bean?

Java中的垃圾收集器-将对象设置为null

在Java中,如何找到进程在运行时使用的垃圾收集器?

Kubernetes:比较Prometheus / PromQL中Pod的RSS内存使用情况和Pod内存需求

垃圾收集器是否在单独的进程中运行?

C#中的垃圾收集器何时退出