【问题标题】:Java service memory usage increasingJava 服务内存使用量增加
【发布时间】:2021-12-08 19:27:59
【问题描述】:

我们的后端服务是使用 java springboot 框架开发的。大型服务之一在保持运行时,内存利用率缓慢增加,如下图所示。当它达到 95% 时,服务会停止,没有任何错误日志记录。它是 32GB 内存。

Memory utilization

堆和 GC 统计数据似乎还不错。

Heap Usage

GC Usage

我还查看了内存转储,没有发现任何本机代码泄漏。

应用程序的登录页面是一个仪表板,用于将并发请求发送到后端。后端必须为此做相当多的处理。当要处理的数据更多时,内存突然激增,之后就再也没有下降过。我查看了堆转储,找不到任何泄漏嫌疑人。

还有什么可能导致内存利用率飙升?

【问题讨论】:

  • 为什么你认为有问题?
  • "服务宕机,没有任何错误日志" 你的意思是JVM退出了?什么是退出状态?有核心文件吗?你试过-XX:+HeapDumpOnOutOfMemoryError吗?
  • 您需要分析在尖峰期间和尖峰之前哪些数据结构或集合占用或消耗更多内存空间。尝试在峰值发生之前进行堆转储,并在峰值发生后进行另一个堆转储。
  • @ScaryWombat 内存利用率达到 95% 服务无响应。
  • @vaibhavsahu 从我的观察 type:byte[] 对象只占用一些空间。但这似乎不是内存使用量增加的原因。

标签: java spring-boot memory memory-management memory-leaks


【解决方案1】:

解决方案:从 G1 GC 迁移到 Shenandoah GC(低暂停 GC)帮助我们暂时解决了内存问题。 改变之后。内存利用率看起来像这样。

命令用法,例如 java -XX:+UseShenandoahGC -XX:+UnlockExperimentalVMOptions -XX:ShenandoahUncommitDelay=1000 -XX:ShenandoahGuaranteedGCInterval=10000 -jar app.jar

而且,您可以在此处了解其工作原理 https://dzone.com/articles/java-garbage-collection-3https://wiki.openjdk.java.net/display/shenandoah/Main

【讨论】:

    【解决方案2】:

    如果应用程序工作正常,这不是问题,只是垃圾收集器在达到 80% 之前不会执行。事实上,带有“GC New Gen Size”的图表显示了典型的“锯齿”,这是完全正常的。在任何情况下,您都可以调整垃圾收集器的工作方式。

    例如: https://sematext.com/blog/java-garbage-collection-tuning/

    在这张图表中,您可以看到一种叫做“鲨鱼牙”的东西。通常,这是一个健康的 JVM 堆的标志。

    【讨论】:

      猜你喜欢
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-07
      • 2014-01-09
      • 2017-04-02
      • 1970-01-01
      相关资源
      最近更新 更多