JDBC驱动自身问题引发的FullGC

SAP PFCG 中的单一角色与复合角色 在 SAP 系统的安全与授权管理中,事务码 PFCG(角色维护)扮演着关键角色。理解单一角色(Single Role)和复合角色(Composite Role)的概念,对于有效地管理用户权限至关重要。 阅读详情

JDBC驱动自身问题引发的FullGC

公众号HelloJava刊出一篇《MySQL Statement cancellation timer 故障排查分享》,作者的某服务的线上机器报 502(502是 nginx 做后端健康检查时不能连接到 server 时抛出的提示),他用 jstack -l 打印线程堆栈,发现了大量可疑的“MySQL Statementcancellation timer”,进一步探究原因,原来是业务应用将数据库更新操作和云存储传图操作放在同一个事务。当云存储发生异常时,由于缺少云存储操作的快速失败,并且缺少对整体事务的超时控制,导致整个应用被夯住,进而 502。

作者文中还谈及他排查过程中注意到 MySQL-Connector-Java 的一个 bug,在 5.1.27 版本以前 MySQL Statement cancellation timer 会导致 Perm 区 Leak,内存泄漏后进而业务应用异常。

我们恰巧遇到过这个坑。鉴于这个坑的排查过程和测试验证还挺有趣,我贴一下去年我们的 RCA 报告:

 

RCA:JDBC驱动自身问题引发的FullGC

郑昀 基于田志全和端木洪涛的分析报告 2015/6/30

关键词:Java,JDBC,升级,MySQL驱动,频繁数据查询,mysql-5.1.34,mysql-5.0.7

 

问题现象:

    2015年4月22日(周日)晚间,线上 TaskMall 工程(一个 Java 工程)频繁报警。分析 jvm 情况,taskmall 在内存使用上确实存在问题,可能有大量对象不正常堆积:
taskmall-jmap-01
图2 155 jmap
 

问题原因:

  频繁的大数据查询场景下,mysql-5.1.34 驱动的性能远优于 mysql-5.0.7 驱动。一定要及时升级驱动啊。

RCA类型:

  维护问题。
  其实我们在RCA(Root Cause Analysis)第四季就曾经遇到此类问题:
第四季案例5 官方驱动也会设计不当,及时升级
——实例:
2013年1月,由于 PHP 一直使用 MongoDB PHP Driver 1.2.x 驱动,导致 PHP-FPM 模式下,每一个 PHP Worker 进程都有自己独立的 mongodb 连接池,从而导致连接数极易超标,占用内存数也随之倍增,MongoDB 负载很重。
如当时编辑后台192 --> mongodb-165 之间的连接数基本维持在:750~751个左右。
升级到 mongodb-php driver 1.3.2 驱动之后,日常连接数大为下降。
——教训:
引入了重要存储介质的驱动之后,如spymemcahced、mongodb php/java driver、jedis等,保持跟踪它们的动态,第一时间更新驱动。

问题分析:

  志全分析堆栈信息发现,系统中有大量的 CancelTask 定时任务需要执行。
lots of CancelTask
图3 大量的CancelTask
 
  为什么会有这么多的任务呢?
  这是 mysql 的一个定时任务,主要用于查询超时处理。即,系统在执行一个 sql 查询时,jdbc 会给你一个超时时间。为了保证超时时间后,能够关闭 statement,会打开一个保护关闭的定时任务。如果超时情况下,sql 还没响应执行,cancel task 就会执行关闭任务。注,ibatis 的默认超时时间为3秒(<setting name="defaultStatementTimeout" value="3000" />)。
mysql-src-cancelTask-01
图4 mysql源码
  其实,cancel() 方法只是对状态做了一个标记而已:
mysql-src-cancelTask-02
图5 mysql源码
  只有在调度任务时,发现状态为取消,才会真正移除该任务:
mysql-src-cancelTask-03
图6 mysql源码
于是,在某些情况下,CancelTask 会大量累积,从而严重影响 JVM 内存,最终引发 FullGC!
 

问题解决:

  志全分析了 MySQL 最新的 jdbc 驱动,发现 CancelTask 在 mysql 驱动中,后续的版本已经不采用全局的 Timer 任务池了。
在 mysql-connector-java-5.0.7-bin.jar 中:
mysql-src-jdbc-old
图7 mysql源码
 
而在 mysql-connector-java-5.1.34-bin.jar 中:
mysql-src-jdbc-new
图8 mysql源码
 
  端木洪涛经过针对性的压力测试,确实证实了这个现象可以重现。测试报告如下所示:

测试时间:2015年4月29日

使用taskmall联调环境做测试。

协调器:10.8.210.168

分发器:10.9.210.151、10.9.210.152

执行器:10.9.210.154

 

分发器配置如下:

151使用mysql-5.1.34驱动,152使用mysql-5.0.7驱动。其中分发器两机器为2核8G配置,统一resin4 JVM配置:

               <jvm-arg>-Xmx1024M</jvm-arg>
               <jvm-arg>-Xms1024M</jvm-arg>
               <jvm-arg>-Xmn512M</jvm-arg>
               <jvm-arg>-XX:SurvivorRatio=6</jvm-arg>
               <jvm-arg>-Xss1024k</jvm-arg>
               <jvm-arg>-XX:PermSize=256M</jvm-arg>
               <jvm-arg>-XX:MaxPermSize=256M</jvm-arg>

 

基础准备:

1、往数据库中压入5180条队列数据,(其中151机器分的2614条,152机器分得2566条);

2、改造执行器,使其只接受数据不处理数据。则5180条数据对分发器来说一直都是有效数据;

3、改造分发器,设置ibatis参数:cacheModelsEnabled="true"、defaultStatementTimeout="3000"。每150ms加载一次数据;

    (分发器起16个线程对应16个cobar分库,每个线程分页加载分库中的有效数据,每页200条数据。)

4、jvisualvm远程监控151、152机器。

 

测试结果如下:

一、15分钟后监控结果如下

从图上看出152机器从cpu占用、堆大小在逐渐升高,查看gc日志发现152已经开始出现FullGC。

 

152机器已快挂:

152-fullgc-jdbc-old

 

151机器则一切正常:

151-normal-jdbc-new

 

二、32分钟后监控结果如下

此时除了cpu占用、堆飙高外,152的线程数也远远高于151。此时的152已经频繁FullGC了。

152机器:

152-fullgc-jdbc-old-32

 

151机器则:

151-normal-jdbc-new-32

 

统计堆内存中活着对象数据:

152机器出现大量的Byte数据以及PreparedStatement,以及CancelTask。

1)但是在151机器上前47位的占用排行上找不到CancelTask。

2)在byte数据量上,152机器达到了600M,而151机器只有几十M。

 

测试结论:

频繁的大数据查询场景下,mysql-5.1.34 驱动的性能处理远优于 mysql-5.0.7 驱动。

 
微信小程序数据采集实战:抓包+接口分析+动态数据全流程 微信小程序爬虫虽然比普通网页爬虫复杂,但只要掌握了正确的方法,其实并没有想象中那么难。核心思路就是:先绕过证书校验抓包,然后反编译小程序找到加密逻辑,最后用Python模拟相同的加密和解密过程。需要特别提醒的是,本文仅供技术研究使用。请遵守《网络安全法》和相关法律法规,不要爬取他人的敏感数据,不要将爬虫技术用于非法用途。尊重他人的知识产权和数据安全,才能让技术发挥真正的价值。 阅读详情

相关推荐

医学图像配准实战:用Python实现MIND特征提取(附完整代码)

本文详细介绍了MIND(模态无关邻域描述符)在医学图像配准中的应用。通过Python和PyTorch实战,从原理到代码逐步解析了如何提取MIND特征,并利用其对结构而非灰度的感知能力,有效解决CT、MRI等多模态图像的对齐难题,为病灶追踪、手术导航等高级应用提供鲁棒性基础。

263

Doris 修改 mem_limit

try to allocate a new buffer failed:Memory limit exceeded: could not allocate 16.88 B without exceeding limit,

ElcarimQ的博客 3940

PowerShell 7.x 替换默认 PowerShell 的四层系统级配置指南

PowerShell 是 Windows 系统管理与自动化的核心命令行环境,其版本演进带来跨平台、UTF-8 默认、.NET Core 运行时等关键升级。理解 PowerShell 5.1(基于 .NET Framework)与 PowerShell 7.x(基于 .NET 6/7/8)的本质差异,是解决执行策略失效、中文乱码、双击脚本拦截等高频问题的前提。技术价值在于统一编码行为、提升脚本可移植性,并支撑现代 DevOps 流水线;典型应用场景包括 Windows Terminal 默认 Shell 切换

weixin_33423874的博客 328

MySQL Statement Cancellation Timer问题

MySQL Statement Cancellation Timer问题 线上日志最近报这样的错误: &quot;MySQL Statement Cancellation Timer&quot; daemon prio=10 tid=0x00007f0cf403c800 nid=0x6e42 in Object.wait() [0x00007f0ce4f4e000] java.lang.Thread.State...

面朝大海,春暖花开 1万+

Jitsi Meet保姆级自建教程:5分钟搞定私有化视频会议服务器(含Docker部署避坑指南)

本文提供了一份详尽的Jitsi Meet私有化视频会议服务器自建教程。通过Docker Compose部署方案,在5分钟内即可搭建基础服务,并深入解析了SSL/TLS证书配置、TURN服务器优化等关键步骤,确保部署的安全与可扩展性,为企业构建自主可控的远程协作平台提供完整指南。

weixin_29305337的博客 621

LTC3783 LED驱动控制器设计与效率优化详解

开关电源控制器是现代LED照明的核心器件,通过电流模式控制实现高效能量转换。其核心原理是通过采样电阻检测负载电流,配合误差放大器形成闭环调节,在汽车电子、显示背光等场景中确保±3%的电流精度。LTC3783作为典型代表,集成升压/降压-升压多拓扑支持,配合PWM调光技术可实现3000:1的无色偏调光范围。在工程实践中,需重点考量功率电感选型、MOSFET开关损耗与热管理设计,例如在38W功率方案中采用10μH/5A电感和4.5mΩ MOSFET可达成95%效率。该方案特别适用于需要应对9-36V宽输入电压波

weixin_36231030的博客 401

MySQL连接池引起的FullGC问题分析_java sigsegv com

可以看到,每次创建一个新的数据库连接时,都会将创建的连接包装成PhantomReference后放入connectionFinalizerPhantomRefs中,然后这个清理线程会在一个无限循环中,获取referenceQueue中的连接并关闭。理论上来说,连接池是不会频繁的创建连接的,除非有活跃连接很少,且存在波动,并且keepAlive操作没有生效,在连接池进行keepAlive操作时,MySQL连接就已经失效,那么则会丢弃这个无效连接,下次再重建。果然,数据库的超时时间被设置成了5分钟!

2401_88972518的博客 485

Anaconda报错no qt platform plugin could be initialized

今天因为在anaconda中安装了一个新包,安装成功后运行python 程序报错:no qt platform plugin could be initialized。 1.安装Anaconda3-4.2.0-Windows-x86_64,对应python版本为3.5.2,scikit learn版本是0.17。因为要用Isolation Forest算法,只有0.18以上版本scikit learn才包含此算法,所以想更新scikit learn。 conda install scikit-lear

zhang1806618的博客 1万+

频繁FullGC的排查

频繁FullGC的排查

Jaemon 1091

微信小程序一键跳转公众号(使用 official-account 组件)

在当今移动互联网时代,用户体验已成为应用成功的关键因素之一。微信小程序作为一种便捷的应用形式,广泛应用于各个行业,为用户提供了丰富的服务和信息。然而,如何进一步提升用户体验,使其在小程序中能够更方便地获取相关信息,成为开发者需要关注的重要课题。实现一键跳转到公众号的功能,正是一个有效的解决方案。通过这一功能,用户可以轻松访问公众号,获取更多内容和服务,从而增强与品牌的互动和粘性。本文将详细介绍如何在微信小程序中实现这一功能,并提供相关的操作步骤和注意事项。

不迁怒,不贰过。小知识,大智慧。 3128

9篇3章3节:FAERS数据库公共仪表板搜索功能操作与解析

FAERS(FDA不良事件报告系统)公共仪表板是一个强大的工具,用于查询和分析药物及生物制品的不良事件数据。通过该仪表板,用户可以按药品或不良反应进行搜索,查看报告数量、事件类型及时间分布,从而辅助药物安全性分析和科研研究。本文重点介绍仪表板的搜索功能,包括按产品和按不良反应查询的操作步骤、筛选与多维数据分析方法,以及关键概念的解释,帮助用户科学、理性地使用FAERS数据,提升用药决策的准确性和安全性。

MD Code 1589

每日问答java基础篇

学习笔记,自看

qq_42728408的博客 314

基于通义千问2.5-7B-Instruct的技术深度解析

通义千问2.5-7B-Instruct是一个基于Transformer架构的大型语言模型,具有70亿参数。它通过自注意力机制和前馈神经网络处理输入序列,能够捕捉长距离依赖关系,适用于多种NLP任务。微调是指在预训练模型的基础上,使用特定任务的数据进行进一步训练,以使模型更好地适应特定任务。微调可以显著提高模型在特定任务上的性能。通义千问2.5-7B-Instruct是一个强大的语言模型,适用于多种NLP任务。通过深入理解其架构、微调方法和核心代码,可以更好地应用于实际场景。

zhangjiaofa的专栏 1570

Tomcat部署的WAR包应用服务突然访问很卡,重启WAR包后才解决

所以基本上:tomcat发起得。

beauty_魅影 1183

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java面试核心:JVM、集合框架与SpringBoot深度解析

Java作为企业级开发的主流语言,其核心技术栈如JVM内存模型、垃圾回收机制、集合框架的线程安全实现等,是面试中的高频考点。理解这些基础概念不仅有助于应对技术面试,更能提升日常开发中的问题解决能力。以HashMap为例,其线程安全问题源于并发操作下的数据不一致性,解决方案包括使用ConcurrentHashMap或同步包装类。SpringBoot的自动装配原理则通过条件注解和spring.factories机制实现,极大简化了配置工作。掌握这些技术原理,结合结构化表达和适当的幽默类比,能在面试中展现扎实的技

weixin_33923762的博客 325

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Spring Boot 3.4.13 + JDK 17 迁移实战:从架构重置到生产就绪

Spring Boot 和 JDK 是 Java 企业级应用的核心运行时基础。Spring Boot 3.x 强制要求 JDK 17+,标志着从传统 Servlet 容器、Parallel GC 到 Jakarta EE 9 命名空间、ZGC 与模块化 JVM 的代际升级。其本质不仅是版本更新,更是字节码规范(Class File Format 61)、API 契约(javax → jakarta)和内存模型的全面对齐。技术价值体现在低延迟(ZGC P99 <10ms)、强安全(TLS 1.3 原生支持)与

weixin_30653023的博客 430

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java高并发系统 + 安全监控 完整知识体系

本文系统梳理了Java高并发开发的全方位知识体系,涵盖单机并发基础、分布式架构、系统安全、监控体系和故障治理等核心模块。主要内容包括: 单机并发基础 CPU多级缓存与内存模型 JMM内存模型与happens-before原则 锁机制与CAS原子操作 并发容器与线程池原理 JVM调优与性能优化 分布式高并发架构 分布式锁与一致性算法 缓存体系与典型问题解决方案 消息队列的削峰填谷 负载均衡与分库分表 微服务通信与流量控制 生产级解决方案 高并发业务安全防护 全链路监控体系搭建 典型故障排查与治理 应急预案与性

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 576

Java中级开发面试核心:并发编程与JVM调优实战

并发编程是Java开发的核心技能,涉及线程安全、锁优化等关键技术。通过synchronized和ReentrantLock等机制实现线程同步,其底层原理涉及JVM monitor和AQS队列。JVM调优则关注内存管理、垃圾回收策略等,合理配置参数可显著提升系统性能。这些技术在电商秒杀、金融交易等高并发场景中尤为重要。本文结合面试真题,深入解析Java并发编程三大核心问题与JVM性能调优实战要点,帮助开发者掌握系统设计关键能力。

weixin_34199335的博客 405

Java应用CPU 100%排查:从jstack到系统化根因定位与治理

CPU使用率是衡量系统性能的核心指标之一,其异常飙高通常意味着应用存在性能瓶颈或资源竞争。从原理上看,CPU高负载的本质是单位时间内需要处理的指令过多,可能源于计算密集型任务、频繁的上下文切换、外部资源瓶颈或垃圾回收压力。在Java应用场景中,这直接关系到服务的响应能力和稳定性。为了有效定位问题,开发者需要超越单一的线程快照分析,构建一套涵盖系统监控、JVM诊断和代码剖析的立体化排查体系。例如,结合 `jstack` 进行线程状态分析,利用 `Arthas` 生成CPU火焰图进行热点方法定位,并通过监控 `

weixin_33748818的博客 430

Java最高频八股文速通

final 类:String 类被声明为 final,这意味着它不能被继承,从而防止了通过继承改变其行为。final 字段:String 类中的 value 字段是 final 的,这保证了 String 对象在创建后其内部字符数组不会被改变。没有提供修改方法:String 类没有提供任何可以修改其内容的方法。所有对 String 的操作(如拼接、替换等)都会生成一个新的String 对象。

qq_43751506的博客 6402

大数据组件GC问题

GC,指Garbage Collection 是JAVA中的垃圾收集器。 相关组件的常见GC问题 1、Namenode的堆内存配置过小导致频繁产生full GC导致namenode宕机,在hadoop中,数据的写入&amp;amp;amp;读取经由namenode,所以namenode的jvm内存需要足够多,尤其是在出现大量数据流动的场景中。建议nameNodejava -Xmx的值为4G 左右并随着文件数增加做...

weixin_40809627的博客 3027

MySQL Statement Cancellation Timer] but has failed to stop it.

1、最近部署到tomcat底下的项目经常时不时访问不了,报的错误如下面所示: WARNING [localhost-startStop-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [studyproject] appears to have star...

茕夜 6507

系统GC问题排查方法总结

一文教你如何解决系统out of memory问题

Darlight的博客 7685

高并发下 MySQL Statement Cancellation Timer 的线程数暴涨

微信公众号:运维开发故事作者:老郑。

wanger5354的博客 1587
上一篇: 线上Java应用排查和诊断规范
下一篇: Java两则故障分析和常见连接超时时间
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值