SpringBoot应用程序内存始终超过JVM配置的堆大小

问题描述 投票:0回答:1

Spring Boot应用程序内存使用量持续超过JVM配置的堆大小且没有溢出错误,用top命令查看RES使用量已接近5G。

我的应用程序部署在Linux上,项目中使用的框架是spring-rabbit(版本2.3.11)与kafka-clients(2.7.1)和spring-kafka(2.7.8)。项目只有一个HTTP接口,接口内部的代码使用方式如下:

private final KafkaTemplate<String, String> kafkaTemplate;
private final RabbitTemplate rabbitTemplate;
rabbitTemplate.convertAndSend("cloud", "ctrlLog", data);
kafkaTemplate.send(BIG_DATA_TOPIC, data);

JVM 配置:

  • java虚拟机规范1.8
  • 堆内存设置:
    -Xms3072m -Xmx3072m
  • 元空间设置:
    -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=512M
  • GC 设置:
    -XX:+UseG1GC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70
  • 其他参数:
    -XX:NativeMemoryTracking=detail -XX:LargePageSizeInBytes=128M

自己尝试过,-XX:NativeMemoryTracking=detail导出文件分析和dump文件分析,但是没有发现问题,几天后通过

jcmd pid VM.native_memory detail.diff scale=MB
发现是

[0x00007f32dc1cf5ea] JNIHandleBlock::allocate_block(Thread*)+0xaa
[0x00007f32dc163dda] JavaCallWrapper::JavaCallWrapper(methodHandle, Handle, JavaValue*, Thread*)+0x6a
[0x00007f32dc166840] JavaCalls::call_helper(JavaValue*, methodHandle*, JavaCallArguments*, Thread*)+0x8f0
[0x00007f32dc1debf4] JVM_DoPrivileged+0x4f4
                             (malloc=1049MB type=Internal +456MB #3526800 +1531841)

但我不太明白泄漏发生在哪里。

导出的与您自己对问题的分析相关的文档。

java spring-boot memory memory-leaks overflow
1个回答
0
投票

英语不是我的母语;请原谅打字错误。 目前的问题已经解决。 泄漏已通过分析器火焰图解决。 泄漏的原因是一个 JSON 实用程序类在执行 toString 时不断安全地加载该类。

© www.soinside.com 2019 - 2024. All rights reserved.