Java K8容器编排:JVM未释放内存
我们有基于java的微服务。当这些微服务不提供任何请求时,微服务的每个pod使用大约270MB。我们将每个微服务的内存限制保持为512Mi 我在一些微服务上做了一些负载测试。对于一个微服务,我每秒发出20个API请求。另一方面,每秒30个请求。Java K8容器编排:JVM未释放内存,java,performance,kubernetes,microservices,heap-dump,Java,Performance,Kubernetes,Microservices,Heap Dump,我们有基于java的微服务。当这些微服务不提供任何请求时,微服务的每个pod使用大约270MB。我们将每个微服务的内存限制保持为512Mi 我在一些微服务上做了一些负载测试。对于一个微服务,我每秒发出20个API请求。另一方面,每秒30个请求。 我观察到的一个一致的模式是:内存利用率随着负载的增加而增加,并且在负载测试之后内存不会被释放(当然,除非容器被终止)。 一旦我完成负载测试,我会等待一个小时左右。然而,内存利用率并没有下降。pod继续占用与以前相同的内存量。 我在这样一个pod的容器中也
我观察到的一个一致的模式是:内存利用率随着负载的增加而增加,并且在负载测试之后内存不会被释放(当然,除非容器被终止)。
一旦我完成负载测试,我会等待一个小时左右。然而,内存利用率并没有下降。pod继续占用与以前相同的内存量。
我在这样一个pod的容器中也得到了一个shell,我只能看到
java进程
和sh进程
正在运行。事实上,我看到pod的内存使用量增加到了360MB左右
因此,一个pod通常需要270MB(在没有任何负载测试的情况下),在负载测试下需要360MB(每秒30个API请求),并且在负载测试完成后很长时间内继续使用360MB
我不明白为什么吊舱的使用率没有下降
可能是:
resources:
limits:
memory: 512Mi
cpu: '0.5'
requests:
memory: 256Mi
cpu: '0.1'
顺便说一下,我正在使用ApacheJMeter进行API负载测试。
正在使用的Docker映像是:openjdk:8-alpine
我还下载了堆转储并在Eclipse内存分析器工具中打开了它 但是,我没有看到任何应用程序类(从我们的代码中)使用大量堆。
我只看到与JDK和Spring框架相关的类,它们没有显示任何内存泄漏 所以,对我来说,谜团是:为什么在负载测试后2-3小时内存使用率都没有下降?
是请求和限制的Kubernetes配置还是JVM GC设置调优?
JVM GC设置是否可能不能很好地处理Kubernetes请求和内存限制 添加JVM详细信息以供参考:
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (IcedTea 3.12.0) (Alpine 8.212.04-r0)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
请添加有关您正在使用的特定JVM的信息。@ThorbjørnRavnAndersen,已编辑了我的问题并添加了JVM详细信息这是Java新版本的重点领域。我建议您尝试迁移到Java11。我在这方面做了更多的研究。事实上,OpenJDK 12和Eclipse OpenJ9虚拟机解决了上述问题。我会在以后的某个时候给我自己的问题写一个详细的答案。@ChetanYewale-你有没有在任何地方写下导致这个问题的原因?我也面临同样的问题。