Hutool被卖半年多了,现状是逆袭还是沉寂?
善孟墒仕前言研发突然反馈一个版本上线后线上系统younggc时间变长而这个版本修改的代码就是非常普通的CRUD但是younggc时间就硬生生暴涨了100%。导致天天告警虽然问题不大但非常想知道原因于是向我求助。问题现场如下图所示,younggc一个版本后从60ms涨到了120ms。而告警的阈值在100ms导致每次younggc都告警。显然调整告警阈值是最简单的方案但作为一个有好奇心对技术很执着的同学他很纠结于这个问题。当然我也是遇到有意思的问题就必须去一探究竟的性格两者一拍即合。younggc_slower代码改动第一反应肯定是去看代码的变化代码改变如下所示:改之前:void functionA(){......a.setBuinsessKey(key1);......}改之后:void functionB(){......a.setBusinessKey(Key1);a.setBuinessesKey(Key2);a.setBusinessKey(Key3);......}看着这微小的改动引起了这么大的变化这是不可能的。笔者第一时间便否决了这种可能性。流量变化以这么多年我troubleshooting的第一直觉肯定是负载变化才能引起younggc耗时的变化。询问那位同学他明显是已经考虑了这样的问题。当即甩给了我相关的监控截图。从分钟级的尺度来讲没有任何变化。younggc_slower容器问题由于younggc耗时高集中在几台机器上于是笔者登陆上那几台机器发现在younggc耗时变高的时候都出现了nr_throttled也就是当前容器的CPU时间片消耗达到了配置的cgroup上限导致被kernel强制offline了。但到底是younggc导致了throttle还是throttle导致了younggc这个因果关系以现有的信息来说完全无法判断。nr_throttled_deltaYounggc日志既然不能一眼看出来原因那只能上去分析gc日志了比对一下gc。发现差距在Object Copy上。偏长younggc 120ms[Object Copy (ms): Min: 107.5, Avg:108.2,Max:108.9,Diff:0.8,Sum: 869.5]正常younggc 60ms[Object Copy (ms): Min: 55.2, Avg: 56.1, Max:56.3, Diff: 1.1,Sum: 450.0]嗯从这个数据来判断肯定是要Copy的数据变多了。为什么会变多呢看看其younggc后的各年代的变化。偏长younggc 120ms[Eden: 4804.0M(4804.0M)-0.0B(4784.0M) Survivors: 108.0M-128.0M Heap: 6632.7M(8192.0M)-1848.8M(8192.0M)]正常younggc 60ms[Eden: 4848.0M(4848.0M)-0.0B(4832.0M) Survivors: 64.0M-80.0M Heap: 6717.7M(8192.0M)-1888.0M(8192.0M)]笔者敏锐的观察到Survivor区变大了。偏长Younggc Survivor区是108M而正常Younggc Survivor区是64M。Object Copy哪些数据问了一下geminiobject copy的对象一般有从1.从Eden Region复制到Survivor Region2.从Survivor Region复制到老年代Region这两个地方进行Copy。也就是说如果Survivor区变大了之后Object Copy的数据应该是会变多。嗯虽然大模型经常忽悠我但这个回答还是比较符合逻辑的姑且就相信他。观察gc监控鉴于上面的分析笔者突然觉得Younggc的时间很有可能和Survivor区的大小成正比关系。一旦Survivor区大于一个阈值那么Younggc时间就会超过100ms进而导致告警。为了验证这个关系笔者去观察了不同机器正常younggc和偏长younggc的关系。发现完全符合这个规律。为什么Survivor区会变化由于分钟级的请求量没有任何变化。监控当前的精度只能到分钟级于是笔者只能在请求机器上的日志中寻找相关的线索。比较了相关的业务日志笔者敏锐的发现了一个不一样的地方。在相同数据量的情况下分批的次数越多它的Younggc越长。如果一共需要处理100W条数据case 1: 分了10000批每批处理1000条数据Survivor区100M。对应的younggc在100-120mscase 2: 分了5000批每批处理2000条数据Survivor区50M对应的youggc在50-70ms发现了这个规律之后笔者去看了下业务系统的源代码。其伪代码如下所示:// 这边的batchNo就是for(long batchNo : batchNoList) {// 按照批次从数据库中捞取相关数据List task selectFromDBBatchNo(bachNo);// 处理相关数据handleTask(task);}看到这段代码上面的规律就很好理解了batchNoList以及其相关数据是一直在for的计数里面一直到处理完毕整个batchNoList以及其相关数据的引用都不会被回收。所以batchNoList(批次)数量越大在Survivor区younggc的时候需要copy到old区的数据量就越多。反而在每次循环的循环体中通过batchNo从数据库中捞取的数据在处理完之后就没用了younggc的时候自然消亡完全不参与相关younggc运算。long_vs_normal为什么以前没问题上了个版本就出问题了首先这个肯定和修改的代码没有关系笔者推测是由于上游流量的变化导致了批次数量的变化。这个也在后续的数据分析中得到了相关的印证。解决方案找到根本原因之后解决这个问题就很简单了将分批数给设定一个最大值强制限制分批大小。代码只需寥寥数行但是要知道怎么改则需要大量的观察和分析。总结Younggc时间变长是一个比较棘手的问题因为它的可观测信息过少而且往往和代码变更无关而和请求分布导致的内存生成速率与存活分布有关。这时候只有通过大量的观察来分析各种数据间的相关性然后通过底层原理推断出因果性最后才能找到根因。

相关新闻

Next.js 静态生成深度解析

Next.js 静态生成深度解析

## 静态生成:Next.js 里那个被低估的“老实人” 最近和几个团队聊起 Next.js,发现不少人一提静态生成就觉得是“老古董”,只能做博客和文档站。这其实是个挺大的误解。静态生成在 Next.js 里,更像是一个基本功扎实、平时话不多但极…

2026/5/17 8:15:53 阅读更多 →
Vue - Vue3 与 Vue2 自定义指令(自定义指令实现、自定义指令钩子函数)

Vue - Vue3 与 Vue2 自定义指令(自定义指令实现、自定义指令钩子函数)

一、Vue3 与 Vue2 自定义指令文档Vue3 自定义指令文档:https://cn.vuejs.org/guide/reusability/custom-directives.htmlVue2 自定义指令文档:https://v2.cn.vuejs.org/v2/guide/custom-directive.html二、Vue3 与 Vue2 自定义指令实现 1、全局自定义指令…

2026/7/3 20:17:31 阅读更多 →
SQL 的 WHERE 子句的庖丁解牛

SQL 的 WHERE 子句的庖丁解牛

WHERE 子句是 SQL 的过滤器,也是数据库性能优化的主战场。 很多开发者认为 WHERE 只是简单的“筛选条件”,但在数据库内核眼中,WHERE 是一个复杂的逻辑表达式树,它直接决定了: 走哪个索引(Index Selection&…

2026/5/17 8:15:50 阅读更多 →

最新新闻

测试转大模型:AI 测试工程师的能力跃迁,把学习路线落到项目证据

测试转大模型:AI 测试工程师的能力跃迁,把学习路线落到项目证据

《测试转大模型:AI 测试工程师的能力跃迁,把学习路线落到项目证据》看起来是个大话题,但真落到项目里,常常就是几个具体选择。下面我尽量按实际开发时会遇到的问题来讲。摘要这篇面向想进入 AI 测试和质量工程方向的软件测试工程师…

2026/7/6 12:55:41 阅读更多 →
Blender贝塞尔曲线插件终极指南:10个技巧让你的3D设计效率翻倍

Blender贝塞尔曲线插件终极指南:10个技巧让你的3D设计效率翻倍

Blender贝塞尔曲线插件终极指南:10个技巧让你的3D设计效率翻倍 【免费下载链接】blenderbezierutils Blender Add-on with Bezier Utility Ops 项目地址: https://gitcode.com/gh_mirrors/bl/blenderbezierutils 你是否曾经在Blender中为绘制复杂的贝塞尔曲线…

2026/7/6 12:55:41 阅读更多 →
SeetaFace6实战:从零构建C# WinForm人脸多属性检测系统

SeetaFace6实战:从零构建C# WinForm人脸多属性检测系统

1. 环境准备与SDK集成在开始构建人脸多属性检测系统之前,我们需要准备好开发环境。首先确保你的Windows系统是64位版本(Win7及以上),并安装Visual Studio 2019或更高版本。我推荐使用.NET Framework 4.7.2以上版本,这是…

2026/7/6 12:53:38 阅读更多 →
免费文档下载神器:一键获取百度文库、道客巴巴等30+平台学习资料

免费文档下载神器:一键获取百度文库、道客巴巴等30+平台学习资料

免费文档下载神器:一键获取百度文库、道客巴巴等30平台学习资料 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本…

2026/7/6 12:53:38 阅读更多 →
OpenCV 4.8 频域滤波实战:3步消除图像边缘效应与指纹环带分析

OpenCV 4.8 频域滤波实战:3步消除图像边缘效应与指纹环带分析

OpenCV频域滤波实战:消除边缘效应与指纹环带分析的三步法则频域滤波的核心挑战与解决方案当我们把图像从空间域转换到频域进行分析时,总会遇到两个典型问题:图像边缘突变导致的频谱干扰和特定纹理(如指纹)的环状频域特…

2026/7/6 12:51:36 阅读更多 →
OpenCV 4.8 图像频域分析实战:5种经典纹理频谱特征提取与可视化

OpenCV 4.8 图像频域分析实战:5种经典纹理频谱特征提取与可视化

OpenCV 4.8 图像频域分析实战:5种经典纹理频谱特征提取与可视化在数字图像处理领域,频域分析为我们打开了观察图像的全新视角。通过傅里叶变换,我们能够将图像从空间域转换到频率域,揭示隐藏在像素背后的周期性结构和纹理特征。本…

2026/7/6 12:51:36 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

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/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

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

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

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

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

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

2026/7/6 6:52:56 阅读更多 →

月新闻