SpringBoot在一次http请求中耗费了多少内存?
在实际工作中经常会需要进行在全链路压测优化 GC参数优化 JVM 内存分配。当知道 1 次 RPC 请求和 Http 请求需要的堆内存大小后你可以精确地计算指定的并发量之下系统需申请多少堆内存。同时结合 JVM 新生代堆大小就能推算出 1 分钟发生多少次 GC这个 GC频率是否过于频繁从而针对性的优化。我们希望 1 次 Rpc、Http 请求申请堆内存足够少这样可减少 GC 导致的系统停顿提高系统性能单机可以支撑更高的并发量。1次 Http 请求申请多少堆内存1 次 RPC 请求申请多少堆内存如果不亲自实验无法得出结论。01实验思路关键动作创建SpringBoot新应用(版本 2.5.4 )。新增 Post 接口供 JMeter 调用。JMeter开源压测工具新建测试计划。每个线程执行2000 次Http接口调用共10 个线程总调用 20000 次。SpringBoot 打印 GC 详细日志记录GC 前后新生代申请了多少内存。Jmeter 调用 20000 次 Http 接口以后通过手动 GC 的方式触发 GC通过 GC 详细日志计算压测期间新生代堆内存增长量。对象基本分配在新生代02SpringBoot 声明 Http 接口如下代码声明了一个 Post接口 create创建了 Get 接口用于触发GC。Slf4j RestController public class TestController { private AtomicLong count new AtomicLong(0); ResponseBody RequestMapping(value create, method RequestMethod.POST) public String create(RequestBody Order order) { //log.warn(收到提单请求 cnt{}:{}, count.getAndIncrement(), order); returnok; } ResponseBody RequestMapping(value gc, method RequestMethod.GET) public String gc() { System.gc(); returnok; } }03JMeter 新建测试计划3.1 新增线程组新建线程组选择 10 个线程每个线程循环 2000次。3.2 新建 Http 默认值3.3 新建请求头由于请求体是 JSON所以新增请求头 Content-Type3.4 新建 Http 请求请求中指定 Url 和 请求体04实验过程4.1 启动 SpringBoot应用堆内存大小 4G其中新生代内存 2G。 SurivivorRadio8 即每个 Surivivor 占比新生代 1/10。指定GC日志位置 -Xloggc:/Users/testUser/log/gc.logjava -server -Xmx4g -Xms4g -XX:SurvivorRatio8 -Xmn2g -XX:MetaspaceSize512m -XX:MaxMetaspaceSize1g -XX:MaxDirectMemorySize1g -XX:HeapDumpOnOutOfMemoryError -XX:PrintGCCause -XX:PrintGCDetails -XX:PrintGCTimeStamps -XX:PrintGCDateStamps -XX:PrintTenuringDistribution -XX:UnlockDiagnosticVMOptions -XX:ParGCCardsPerStrideChunk32768 -XX:PrintCommandLineFlags -XX:UseConcMarkSweepGC -XX:UseParNewGC -XX:ParallelCMSThreads6 -XX:CMSClassUnloadingEnabled -XX:UseCMSCompactAtFullCollection -XX:CMSParallelInitialMarkEnabled -XX:CMSParallelRemarkEnabled -XX:CMSScavengeBeforeRemark -XX:PrintHeapAtGC -XX:CMSFullGCsBeforeCompaction1 -XX:CMSInitiatingOccupancyFraction70 -XX:UseCMSInitiatingOccupancyOnly -XX:PrintReferenceGC -XX:ParallelRefProcEnabled -XX:ReservedCodeCacheSize256M -Xloggc:/Users/testUser/log/gc.log -jar target/activiti-0.0.1-SNAPSHOT.jar4.2 多次手动 GC由于JVM 启动过程中需要加载大量对象所以我们在压测之前先手动 GC清理一下存量对象。curl http://localhost:8080/gc4.3 Jmeter 启动压测执行 JMeter压测计划每次执行会调用 20000 次4.4 GC 日志解读GC 以后新生代 Eden 区已使用内存为 0。GC 前 Eden区大小就是 20000 次 Http 调用所申请的内存总和05实验结果SpringBoot 在处理 Http 请求时即使请求体相对较小 平均每次 Http 调用仍会申请约 34 K 的堆内存 。这一点显得尤为突出因为请求体仅包含 50 个字符远远未达到 1K 大小。然而每次 Http 请求所消耗的内存却依然高达 34K。这可能是由于在 SpringBoot 的内部处理流程中需要创建多个对象这些对象的总内存占用显著高于请求体本身。{userId: 32898493, productId:39043, detail: }在调整 Http 请求后如将 detail 字段设置为 1200 个字符时每次 Http 调用平均占用堆内存为 36K。两次实验结果间的差异为 2K这与 1200 个字符占用的内存大小基本持平需考虑一定的误差。这表明 SpringBoot 内部未进行多次请求体拷贝。5.1 添加日志打印log.warn(收到提单请求 cnt{}:{}, count.getAndIncrement(), order);在打印请求日志后单次 Http 请求的平均内存使用量达到了 56 KB比之前增加了整整 20 KB。然而当我移除 detail 字段后单次请求的内存使用骤降至 35.7 KB。这表明当日志量较小时打印日志对内存占用的影响较小。但随着日志大小的增加内存占用显著上升这可能触发更频繁地GC最终导致系统性能明显下降。因此建议各位严格控制单条日志的大小以优化内存使用和系统性能。06真实的数据根据以上实验结果可得出结论单次 HTTP 请求消耗约34KB内存这并不意味着所有SpringBoot应用的内存消耗都是如此。由于实验所用的代码相对简单因此34KB可能是内存消耗的最小值。举例来说在我司的线上环境中 单次RPC请求的内存消耗在 0.5MB 到 1MB 之间 内存占用量相对较大。这是因为复杂的基础架构、复杂的业务逻辑、复杂的流程、多次下游调用、多次SQL 调用、多次缓存调用、日志打印等等 均需要消耗大量的内存在此之前我一直对新生代 Eden 区高达 5G 的情况下仍每分钟进行 1-2 次 young GC 感到困惑。经过粗略计算后发现如果每次请求消耗 0.5M 内存当单台服务器每秒并发度达到 500 次时每分钟需要分配的内存高达 15G。因此至少需要进行3次 young GC 才能满足需求。

相关新闻

【QML 入门到实战】从零开始搭建第一个 QML 界面(附完整代码)

【QML 入门到实战】从零开始搭建第一个 QML 界面(附完整代码)

2026/7/10 14:00:31 阅读更多 →
CVE-2026-24617:Easy Modal 插件中的存储型XSS漏洞技术分析

CVE-2026-24617:Easy Modal 插件中的存储型XSS漏洞技术分析

2026/7/7 16:21:59 阅读更多 →
AI一周重要会议和活动概览(1.26-2.1)

AI一周重要会议和活动概览(1.26-2.1)

2026/7/9 18:53:03 阅读更多 →

最新新闻

STM32 SPI 模式0/3 实战:W25Q64 Flash 读写时序分析 3 步法

STM32 SPI 模式0/3 实战:W25Q64 Flash 读写时序分析 3 步法

STM32 SPI 模式0/3 实战:W25Q64 Flash 读写时序分析 3 步法当第一次拿到 W25Q64 Flash 芯片的数据手册时,面对密密麻麻的时序图,很多嵌入式开发者都会感到无从下手。SPI 通信看似简单,但模式配置错误会导致数据读写失败。本文将分…

2026/7/11 8:05:38 阅读更多 →
在MiniOB中实现布隆过滤器:C++工程实践与数据库查询优化

在MiniOB中实现布隆过滤器:C++工程实践与数据库查询优化

1. 项目概述:从零到一,理解MiniOB与布隆过滤器的结合如果你正在学习数据库内核或者C,那么“MiniOB”这个名字你应该不陌生。它是一个面向教学和学习的、高度简化的数据库实现,剥离了生产级数据库的复杂特性,保留了最核…

2026/7/11 8:03:37 阅读更多 →
终极指南:使用XUnity.AutoTranslator实现Unity游戏自动翻译

终极指南:使用XUnity.AutoTranslator实现Unity游戏自动翻译

终极指南:使用XUnity.AutoTranslator实现Unity游戏自动翻译 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator是一款强大的Unity游戏翻译插件,专为解决游戏语言…

2026/7/11 8:03:37 阅读更多 →
汉明码 (7,4) 编码实战:Python 实现 1 位纠错与 2 位检错

汉明码 (7,4) 编码实战:Python 实现 1 位纠错与 2 位检错

汉明码 (7,4) 编码实战:Python 实现 1 位纠错与 2 位检错在数字通信系统中,数据传输的可靠性至关重要。汉明码作为一种经典的纠错编码方案,能够有效检测并纠正传输过程中出现的错误。本文将深入探讨(7,4)汉明码的原理,并通过Pytho…

2026/7/11 8:01:37 阅读更多 →
机电一体化学习实战导航:从拧螺丝到系统集成

机电一体化学习实战导航:从拧螺丝到系统集成

1. 这不是“速成指南”,而是一份机电一体化学习者的实战导航图你点开这个标题,大概率正站在人生一个关键岔路口:手握机械、自动化、机器人、新工科类专业的录取通知书,却对“学什么、怎么学、学到什么程度才算入门”毫无头绪&…

2026/7/11 8:01:37 阅读更多 →
真无线耳机实际使用横评:聚焦90%评测忽略的日常失效点

真无线耳机实际使用横评:聚焦90%评测忽略的日常失效点

1. 为什么这篇横评只聊缺点——一个耳机测评老手的真实动机“蓝牙耳机实际使用横评(只说缺点)”,光看标题,你可能觉得这是一篇反向营销稿,或者纯粹为了博眼球的毒舌合集。但作为连续六年深度参与消费电子类配件评测、亲…

2026/7/11 8:01:37 阅读更多 →

日新闻

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南

5分钟完全掌握:ComfyUI ControlNet预处理器终极使用指南 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 想要让AI图像生成真正听从你的指挥吗&…

2026/7/11 0:02:12 阅读更多 →
PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

PIC18F45K42驱动EPT-14A4005P压电蜂鸣器方案详解

1. 项目背景与核心需求 在工业控制、安防系统和智能家居等领域,可靠的声音警报系统是不可或缺的基础组件。传统蜂鸣器存在音量不足、音质模糊等问题,而基于压电陶瓷技术的EPT-14A4005P蜂鸣器配合PIC18F45K42微控制器,能够构建一套适应性强、音…

2026/7/11 0:04:12 阅读更多 →
大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm + Attention 的 CUDA Kernel 手写与验证

大模型推理中的算子融合优化:LayerNorm Attention 的 CUDA Kernel 手写与验证 一、GPU 利用率 30%:分开的算子吃掉所有带宽 推理服务的 GPU 利用率监测显示一个反直觉的现象:计算核心(SM)利用率不到 30%,但…

2026/7/11 0:04:12 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/10 19:03:29 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/9 13:46:46 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/9 21:41:05 阅读更多 →

月新闻