Java 内存泄漏排查中怎么分析 Socket 缓存区未及时关闭引起的内存泄漏

雨芳同学_7312

雨芳同学_7312

2026-10-22

318人浏览

原创

socket缓冲区未关闭引发的典型堆外内存泄漏,表现为rss持续上涨、gc无感、最终系统oom;需通过rss增长、pstack线程栈、/proc/pid/maps可写区、hikaricp泄漏检测、ss/lsof与mysql processlist多维度交叉定位。

java 内存泄漏排查中怎么分析 socket 缓存区未及时关闭引起的内存泄漏

Socket 缓存区未及时关闭引发的内存泄漏,属于典型的堆外(Off-heap)泄漏——它不占 JVM 堆内存,GC 完全无感,但 RSS 内存会持续上涨,最终触发系统级 OOM 或连接雪崩。排查关键不是找“谁没调 close()”,而是追踪“哪个物理连接一直挂着、缓冲区还在收数据”。

看内存特征:先确认是不是堆外泄漏

如果监控显示:

  • jstat -gc 中老年代、元空间增长平缓,但 ps aux --sort=-rss | head -n 10 显示进程 RSS 持续上升
  • /proc//maps 中可写映射区(grep rw | awk '{sum += $3}')随运行时间线性增长
  • pstack 看到大量线程卡在 SocketInputStream.socketRead0 或 EPollArrayWrapper.epollWait

基本可锁定为 Socket 缓冲区堆积,不是堆内对象泄漏。

java后端编程
java后端编程

专用于 Java Spring Boot 后端开发的专业技能。当用户提出以下需求时,应调用此技能:构建 REST API、创建 Spring Boot 项目、编写 Java 后端服务、配置数据库访问(JPA / MyBatis)、处理认证与授权(Spring Security / JWT)、实现微服务架构(Spring Cloud)、排查 Spring Boot 相关错误、审查 Java 代码质量,或执行任何与 Spring Boot / Java 后端相关的任务。

下载

查连接状态:从 OS 和 DB 双向印证

执行以下命令交叉比对:

  • ss -tulpn | grep :3306:看 ESTABLISHED 连接数是否远超 HikariCP 的 maxPoolSize
  • lsof -p | grep IPv4 | wc -l:Java 进程打开的 socket 数是否同步增长
  • 进 MySQL 执行 SHOW PROCESSLIST:重点关注 State 为 Sleep 或 Reading from net、Time > 60s 的连接——这些连接对应的内核接收缓冲区(sk_rmem_alloc)很可能已积压大量未读数据

定位泄漏源头:靠连接池主动兜底

HikariCP 的 leak-detection 不是摆设,要真开、真用:

  • 设 spring.datasource.hikari.leak-detection-threshold=30000(单位毫秒,建议为业务最大预期持有时间的 1.5 倍)
  • 日志出现 "Connection leak detection triggered" 时,会打印完整调用栈,精准到哪一行 getConnection() 没归还
  • 配合 spring.datasource.hikari.log-connection-statement=true,记录每次获取/归还动作,便于回溯上下文

验证释放逻辑:别只关 Connection

很多泄漏卡在“关了 Connection,却漏了 ResultSet”:

  • MySQL 8.0+ 驱动默认缓存元数据和部分行数据,ResultSetImpl 不 close,整块结果集就钉在堆里
  • 检查所有 try-with-resources 是否漏写了 rs:必须是 try (Connection c = ...; PreparedStatement ps = ...; ResultSet rs = ...) {...}
  • 禁止手动 new PreparedStatement 或 DriverManager.getConnection()——绕过连接池的直连,其 Socket 生命周期完全脱离 JVM 管控,GC 无法感知

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10937

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

8062

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6992

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1184

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

968

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1416

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2889

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

20171

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1275

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习