当前位置: 首页 > 知识库问答 >
问题:

Java垃圾收集器会干扰HPA的缩减吗?

尉迟正奇
2023-03-14

我有一个Spring API,它大量使用部署在kubernetes集群上的内存。

我将自动缩放(HPA)配置为将内存消耗视为缩放标准,并运行负载测试在缩放时一切正常,但在缩放时内存不会下降,因此创建的吊舱不会被删除。如果我再次运行测试,将创建新的pod,但不会删除。

使用visual VM进行本地分析,我相信问题与GC相关。在本地,GC在测试期间正常工作,但在请求结束时停止运行,留下垃圾,并且只在很长一段时间后再次运行。所以我相信,这些垃圾正在阻止HPA的规模缩小。

有人有什么可能导致这种效果的提示或我可以尝试的东西吗?

另外,在分析器中,我没有任何内存泄漏的迹象,当我手动运行GC时,留下的垃圾会被移除

以下是一些其他详细信息:

  • Java版本:11

负载测试后的可视VM

负载测试后的新遗迹内存驻留

共有1个答案

章光华
2023-03-14

很可能没有内存泄漏。

JVM从操作系统请求一个内存,达到由Xmx设置的限制 命令行选项。每次主要GC运行后,JVM都会查看使用中的堆内存与(当前)堆大小的比率:

>

如果比率太接近0(即堆太大),JVM可能会收缩堆并向操作系统返回一些内存。它“不情愿”这样做。具体来说,在JVM决定释放内存之前,可能需要多次完整的GC运行。

我认为您看到的是JVM堆大小调整策略的影响。如果JVM空闲,则没有足够的完整GC来触发JVM收缩堆,并且不会将内存返回给操作系统。

您可以通过调用系统来鼓励JVM返回内存。gc()几次。但是运行一个完整的GC需要大量的CPU。如果您确实设法让JVM收缩堆,那么再次扩展堆(对于下一个大请求)将需要更多完整的GCs。

所以我的建议是:不要尝试。使用其他一些标准来触发您的自动缩放...如果有任何意义的话。

需要注意的另一件事是JVM应用程序可能会使用大量的非堆内存;例如可html" target="_blank">执行和共享本机库、本机(C)堆、Java线程堆栈、Java元空间等。这些用法都不受-Xmx选项的限制。

 类似资料:
  • 问题内容: 简短形式:CMS垃圾收集器似乎无法收集数量不断增加的垃圾;最终,我们的JVM填满,应用程序变得无响应。通过外部工具(JConsole或)强制GC 清理一次。 更新:该问题似乎与JConsole的JTop插件有关。如果我们不运行JConsole,或者在没有JTop插件的情况下运行它,则该行为消失。 (技术说明:我们正在Linux 2.6.9机器上运行32位Sun JDK 1.6.0_07

  • 本文向大家介绍Java垃圾收集,包括了Java垃圾收集的使用技巧和注意事项,需要的朋友参考一下 示例 C ++方法-新增和删除 在像C ++这样的语言中,应用程序负责管理动态分配的内存所使用的内存。当使用new运算符在C ++堆中创建对象时,需要相应地使用delete运算符来处置该对象: 如果程序忘记了delete一个对象而只是“忘记”了该对象,则关联的内存将丢失给应用程序。这种情况的术语是内存泄

  • Java 15 使 ZGC、Z 垃圾收集器成为标准功能。它是 Java 15 之前的一个实验性功能。它是低延迟、高度可扩展的垃圾收集器。 ZGC 是在 Java 11 中作为一项实验性功能引入的,因为开发人员社区认为它太大而无法提前发布。 即使在机器学习应用程序等海量数据应用程序的情况下,ZGC 也具有高性能和高效工作。它确保在处理数据时不会因垃圾收集而长时间停顿。它支持 Linux、Window

  • Java 15 使 ZGC、Z 垃圾收集器成为标准功能。它是 Java 15 之前的一个实验性功能。它是低延迟、高度可扩展的垃圾收集器。 ZGC 是在 Java 11 中作为一项实验性功能引入的,因为开发人员社区认为它太大而无法提前发布。从那时起,对这个垃圾收集做了很多改进,例如 - 并发类卸载 取消提交未使用的内存 支持班级数据共享 NUMA 多线程堆Pre-touch 最大堆大小限制从 4 T

  • 问题内容: 我从带有node.js的线程垃圾收集中学到了node.js使用世代GC。 我通常使用循环对象引用(最终我都会删除/确保超出范围),并想知道node.js是否能很好地处理它们。所以例如。如果使用参考完成。计数,会有一个问题,所以我想知道这个节点有多好。 一些使用场景: 对于每个http请求,我创建一个带有lambda的setTimeout,该lambda可能引用了范围对象。作用域对象还引

  • Kubernetes 垃圾收集器的角色是删除指定的对象,这些对象曾经有但以后不再拥有 Owner 了。 注意:垃圾收集是 beta 特性,在 Kubernetes 1.4 及以上版本默认启用。 Owner 和 Dependent 一些 Kubernetes 对象是其它一些的 Owner。例如,一个 ReplicaSet 是一组 Pod 的 Owner。具有 Owner 的对象被称为是 Owner