合肥网站建设设计公司iis如何用ip地址做域名访问网站
2026/5/14 0:10:37 网站建设 项目流程
合肥网站建设设计公司,iis如何用ip地址做域名访问网站,百度推广账户怎么开,网站查询域名访问SpringBoot 在一次 http 请求中耗费了多少内存#xff1f;先说说为啥会关心这个问题先搞懂#xff1a;一次 HTTP 请求#xff0c;SpringBoot 到底在干啥#xff1f;动手测#xff1a;最简单的接口#xff0c;到底耗多少内存#xff1f;第一步#xff1a;准备测试代码第…SpringBoot 在一次 http 请求中耗费了多少内存先说说为啥会关心这个问题先搞懂一次 HTTP 请求SpringBoot 到底在干啥动手测最简单的接口到底耗多少内存第一步准备测试代码第二步测试结果第三步加一点业务逻辑再测影响内存消耗的几个关键因素我是怎么优化的最后聊聊我的看法总结SpringBoot 在一次 http 请求中耗费了多少内存最近一直在琢磨一个问题我们平时写的 SpringBoot 接口处理一次普通的 HTTP 请求到底要耗多少内存之前只关注接口快不快、会不会报错从没细算过内存账这两天抽时间测了下聊聊我的发现不一定全对就是自己的一点心得。先说说为啥会关心这个问题其实一开始我也没当回事直到有次压测小接口明明 CPU 使用率才 30% 多服务却开始频繁卡顿看监控发现堆内存涨得飞快才意识到“单次请求内存消耗”这事儿不能忽略。在我看来哪怕单次耗得少高并发下积少成多也可能让 JVM 频繁 GC甚至 OOM所以还是有必要搞清楚的。先搞懂一次 HTTP 请求SpringBoot 到底在干啥要算内存账得先知道请求进来后SpringBoot 都创建了哪些东西。我简单梳理了下一个普通的 GET 请求过来至少会有这些开销Tomcat 接请求创建 Request/Response 对象SpringMVC 解析请求参数创建 HandlerMethod、参数绑定相关的对象我们自己写的 Service、Mapper 层对象还有查询出来的业务数据对象日志对象、上下文对象比如 RequestContextHolder请求处理完这些对象大多会变成垃圾等 GC 回收。这些对象加起来就是一次请求的内存消耗核心部分。动手测最简单的接口到底耗多少内存光说不练假把式我写了个最基础的 SpringBoot 接口啥业务逻辑都没有就返回个字符串来测测内存消耗。第一步准备测试代码先建个普通的 SpringBoot 项目引入 web 依赖然后写个接口RestControllerRequestMapping(/test)publicclassTestController{// 记录初始内存单位字节privatelonginitialMemory0;GetMapping(/empty)publicStringemptyRequest(){// 获取当前线程的内存使用堆内存RuntimeruntimeRuntime.getRuntime();if(initialMemory0){// 第一次请求记录初始内存避免初始化影响initialMemoryruntime.totalMemory()-runtime.freeMemory();return初始化完成;}// 处理请求时的内存longcurrentMemoryruntime.totalMemory()-runtime.freeMemory();// 单次请求消耗 当前内存 - 初始内存longconsumecurrentMemory-initialMemory;// 打印消耗转成 KB方便看System.out.println(单次空请求内存消耗consume/1024 KB);returnok;}}第二步测试结果启动项目后先访问一次/test/empty做初始化然后再访问几次得到的结果大概是第一次初始化后约 10~20 KB后续多次访问稳定在 2~5 KB 左右这个结果还挺意外的纯空请求居然也要耗这么点内存后来我查了下主要是 Tomcat 和 SpringMVC 底层的对象开销哪怕没业务逻辑这些基础对象还是要创建的。第三步加一点业务逻辑再测光测空接口没意义我再加个简单的业务逻辑比如查询个列表模拟真实场景// 模拟业务对象classUser{privateLongid;privateStringname;privateIntegerage;// 省略 getter/setter}GetMapping(/with-data)publicListUserwithDataRequest(){RuntimeruntimeRuntime.getRuntime();longstartMemoryruntime.totalMemory()-runtime.freeMemory();// 模拟查询10个用户数据ListUseruserListnewArrayList();for(inti0;i10;i){UserusernewUser();user.setId((long)i);user.setName(测试用户i);user.setAge(20i);userList.add(user);}// 计算消耗longendMemoryruntime.totalMemory()-runtime.freeMemory();longconsumeendMemory-startMemory;System.out.println(带10个User对象的请求内存消耗consume/1024 KB);returnuserList;}这次测试结果大概是单次消耗约 30~50 KB。能看出来业务数据对象是内存消耗的大头对象越多、字段越复杂耗得就越多。影响内存消耗的几个关键因素测完之后我总结了下影响单次请求内存消耗的因素主要有这些请求参数和返回数据参数越多、返回的 JSON 数据越大比如列表里的对象多内存耗得越多这是最直观的中间件和框架开销比如用了 RedisTemplate、MyBatis这些框架会创建连接对象、Mapper 代理对象都会占内存日志和监控如果日志级别设为 DEBUG会创建大量日志字符串对象加了 SkyWalking、Pinpoint 这类监控也会多一层对象开销线程本地变量ThreadLocal如果代码里用了 ThreadLocal 没及时清理对象会一直占着内存直到线程销毁临时对象比如循环里创建字符串、List 没复用会产生大量临时对象虽然 GC 能回收但高并发下还是会增加内存压力。我是怎么优化的知道了消耗点我们的经验是从这几个地方入手优化复用对象比如频繁创建的 List、Map用 ThreadLocal 缓存起来复用避免每次请求都 new控制返回数据量分页查询一定要做别一次性返回几千条数据不仅耗内存网络传输也慢减少不必要的对象创建比如字符串拼接用 StringBuilder别用 “” 号循环里别创建匿名内部类及时清理 ThreadLocal在请求结束时比如用 AfterReturning 切面清理 ThreadLocal避免内存泄漏调整 JVM 参数比如设置合适的堆内存大小-Xms、-Xmx让 GC 更高效减少内存碎片。举个简单的优化例子复用 List 对象// 优化前每次请求都new ArrayListGetMapping(/bad)publicListUserbadRequest(){ListUserlistnewArrayList();// 每次都创建新对象// 业务逻辑...returnlist;}// 优化后复用ThreadLocal里的ListprivateThreadLocalListUseruserListLocalThreadLocal.withInitial(ArrayList::new);GetMapping(/good)publicListUsergoodRequest(){ListUserlistuserListLocal.get();list.clear();// 清空复用// 业务逻辑...returnlist;}// 请求结束后清理AfterReturning(/good)publicvoidclean(){userListLocal.remove();}最后聊聊我的看法其实问“一次请求耗多少内存”没有固定答案我认为核心不是纠结具体的数字而是要有“内存意识”——知道哪些代码会耗内存高并发下该怎么优化。普通的业务接口单次消耗几十 KB 其实很正常只要不是几百 KB 甚至几 MB一般都没问题。但如果是每秒几千、几万的高并发接口哪怕单次只耗 10 KB一秒钟也会耗掉几十 MB 内存这时候就得精打细算了。总的来说SpringBoot 本身的基础开销是固定的我们能优化的主要是业务代码里的对象创建和数据传输量。写代码时多留意一下别随手 new 对象别返回多余的数据就能少耗不少内存。总结SpringBoot 处理一次 HTTP 请求的内存消耗分两部分框架基础开销空请求约 2~5 KB 业务对象开销随数据量增加影响内存消耗的核心是返回数据量、临时对象创建、中间件开销这几点优化的关键是复用对象、控制数据量、及时清理 ThreadLocal不用追求极致的内存消耗重点是避免不必要的浪费。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询