我很难理解为什么我的Java应用程序会缓慢地消耗掉pod的所有可用内存,导致Kubernetes将pod标记为内存不足。JVM(OpenJDK 8)是使用以下参数启动的:
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2
我正在监视pod使用的内存和JVM内存,并希望看到一些相关性,例如,在主要垃圾收集后,pod使用的内存也会下降。但是,我没有看到这一点。我在下面附上了一些图表:
Pod内存:
JVM总内存
JVM的详细分类(很抱歉,所有的颜色看起来都一样...谢谢Kibana)
我所纠结的是,为什么当堆内存在16:00之前显著减少时,pod内存没有随之下降?
1条答案
按热度按时间edqdpe6u1#
看起来您正在创建一个资源限制为1GB内存的pod。您正在设置
-XX:MaxRAMFraction=2
,这意味着您正在为JVM分配50%的可用内存,这似乎与您绘制的Memory Limit
相符。然后JVM保留大约80%的数据,这就是您在
Memory Consumed
中绘制的数据。当您查看
Memory Consumed
时,您不会看到内部垃圾收集(如第二个图中所示),因为GC内存被释放回JVM,但仍由JVM保留。Java应用程序中是否可能存在内存泄漏?这可能会导致随着时间的推移保留更多的内存,直到达到JVM限制(512MB),并且Pod被OOM终止。