ResultSet参数设置不当导致OOM

MySQL Java连接器:mysql-connector-java与mysql-connector-j的区别与选择 JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的标准API。作为Java与数据库交互的桥梁,JDBC驱动实现了协议转换和数据处理的核心功能。在MySQL生态中,mysql-connector-java是官方推荐的JDBC驱动,它经历了从mysql-connector-j到mysql-connector-java的演进过程,体现了Java生态的规范化发展。新版驱动在性能优化方面采用X Protocol和异步IO技术,查询效率提升显著;在安全机制 阅读详情

 

1. 背景描述

近期写了一个小程序,用于做数据抽取,目前主要为从数据库抽取数据到MongoDB。程序在线上运行一段时间后就出现了OutOfMemoryError的错误。由于Tomcat中配置了参数-XX:+HeapDumpOnOutOfMemoryError,最后产生了9G的hprof文件,目前也只能通过分析hprof文件来查找内存溢出问题了。

2. 问题发现

最初并未急于分析hprof文件,而是重新跑起程序后使用jstat观察了一阵,发现老年代并没有增长过快,也没有发现问题,看来只能分析hprof文件了。

如果在自己的开发机器上使用memory analyzer tool分析9G的hprof文件,那么至少得9G的内存。由于我的笔记本只有8G,就显得无能为力了。Google一番后发现可以直接在Linux服务器上生成报告结果。

这样一来直接在服务器上分析完hprof文件然后生成报告结果,只需要在开发机器上看报告结果就可以了。

2.1 使用MAT分析大堆

  1. 下载Linux版MAT

  2. 修改MemoryAnalyzer.ini

将-Xmx设置为比堆快照更大的内存

  1. 使用ParseHeapDump.sh分析堆快照
./mat/ParseHeapDump.sh tomcat_dump/jvm.hprof

命令执行完成后,会产生类似如下的一些文件

此时只需要进一步执行命令产生报告结果即可。

  1. 使用ParseHeapDump.sh产生报告结果
./mat/ParseHeapDump.sh tomcat_dump/jvm.hprof org.eclipse.mat.api:suspects

其它报告类型

org.eclipse.mat.api:suspects
org.eclipse.mat.api:overview
org.eclipse.mat.api:top_components

3. 问题解决

最终打开suspects报告后,发现类OracleResultSetCacheImpl的深堆居然有7.8G,这基本断定它就是问题所在了。

ResultSet为什么会缓存呢?就是因为写代码时大意,指定了类型为ResultSet.TYPE_SCROLL_INSENSITIVE

这里ResultSet缓存行是为了游标回退。

此处只需要更改为ResultSet.TYPE_FORWARD_ONLY就解决了问题。

 

Spring JdbcTemplate批量操作实战:原理、性能优化与避坑指南 在Java企业级应用开发中,数据库操作是核心环节,而批量处理技术是提升数据吞吐性能的关键手段。其原理在于通过减少网络往返次数,将多条SQL语句打包一次性发送给数据库执行,从而显著降低I/O开销和系统负载。这项技术对于高并发、大数据量场景下的数据导入、状态批量更新等操作具有重要价值。Spring框架的JdbcTemplate在原生JDBC批处理机制之上进行了封装,提供了更简洁的API。本文将深入解析JdbcTemplate的批处理实现,涵盖BatchPreparedStatementSetter的使用、批处理 阅读详情

相关推荐

频繁GC导致OOM内存溢出的问题排查

频繁GC导致OOM内存溢出的问题排查1.问题发现2. 导出内存dump3.用mat分析dump下载mat配置mat运行mat4. 分析5. 解决方案 1.问题发现 日志中打印如下,发现频繁GC并导致OOM [2021-08-25 15:14:33, 948] [ERROR] [] [] [DubboServerHandler-74.0.2.41:11306-thread-488]- org.apache.dubbo.rpc.filter.ExceptionFilter$ExceptionListener.o

没啥简介 2517

OOM专题 - 如何使用JdbcTemplate查询百万行超大结果,以及其他JdbcTemplate 其他冷门实用技能

当一次性查询 百万行的数据,很容易就会导致OOM。全网搜索,没有满意的解决方案,因此自己研究了 几番 JdbcTemplate 源码,手动编码解决。 核心思想: ResultSet 仅仅是 数据库的一个游标指针(cursor),并不是真实的全部数据,所以并不会占据内存空间。理解这一点非常重要!

stomfeng的专栏 4154

Amesim与Simulink联合仿真:S-Function接口配置与实战避坑指南

本文详细介绍了Amesim与Simulink联合仿真中S-Function接口的配置方法与实战避坑指南。从环境搭建、编译器配置到S-Function接口实战,逐步解析关键步骤与常见问题解决方案,帮助工程师高效实现多领域系统仿真,特别适合汽车、航空航天等复杂系统建模场景。

weixin_29173777的博客 344

android内存溢出 gps,ResultSet内存溢出OutOfMemory问题 札记

ResultSet内存溢出OutOfMemory问题错误信息如下:jdbc在操作oracle海量数据的时候用ResultSet获取所有的返回数据出现内存溢出处理:出错的原因是ResultSet用的是可滚动结果集,正常情况下ResultSet是指针指向数据库的数据,本身是不存储数据库的数据的,默认情况下就算是提交的sql能查询处上亿条的数据也是不消耗内存的,但是如果用的是可滚动结果集的ResultS...

weixin_42228776的博客 340

Win11系统重装全记录:从备份Office激活到搞定RAID阵列,我的微星笔记本复活记

本文详细记录了Win11系统重装的完整过程,从数据备份到RAID阵列配置,特别针对微星笔记本的特殊硬件驱动问题提供了解决方案。文章涵盖了Office激活状态备份、BIOS设置、驱动安装顺序等关键步骤,帮助用户顺利完成系统重装并优化性能。

weixin_31421613的博客 309

C/C++ 计算程序运行的时间

C/C++计算程序执行时间的方法,精度依次增加,推荐度也依次增加 1.#include <time.h> clock_t start, finish; double process_interval ; start=clock(); process(); //要计时的程序 finish=clock(); process_interval =(double)(finish-star...

stu_shanghui的博客 1020

mysql jdbc resultset_MySQL JDBC ResultSet读取大量数据报OutOfMemoryError的解决方案

MySQL Connector/J的ResultSet默认会从服务器取回整个结果集并存放到JVM内存中,如果数据量很大,显然会出现OOM错误。根据官方文档JDBC API Implementation Notes中关于ResultSet的说明,有两种解决方案。第一种,使用以下代码让jdbc驱动一次只返回一条记录。stmt = conn.createStatement(java.sql.Result...

weixin_42144366的博客 1256

K-Means聚类算法 — 算法原理、质心计算、距离度量、聚类效果评价及优缺点

分类知识   分类是根据样本某些属性或某类特征(可以融合多类特征),把样本类型归为已确定的某一类别中。机器学习中常见的分类算法有:SVM(支持向量机)、KNN(最邻近法)、Decision Tree(决策树分类法)、Naive Bayes(朴素贝叶斯分类)、Neural Networks(神经网络法)等。   但当对海量数据进行分类时,为了降低数据满足分类算法要求所需要的预处理代价,往往需要选...

zhf的博客 1万+

MongoDB常见问题

// 举例所用到的数据源: { "_id" : ObjectId("5b59bece36de5915645c2208"), "userName" : "xcs", "userId" : "12", "userPwd" : "123", "orderList&q

态度决定一切 1140

STM32F4使用CUBEMX ADC定时采样+DMA

STM32、FFT、ADC、TIM

m0_62379750的博客 4222

11、基于拓扑质心和树编辑距离的RNA二级结构比较方法

本文介绍了一种基于拓扑质心和树编辑距离的RNA二级结构比较方法,特别适用于处理具有假结结构的RNA。通过PEELING算法识别拓扑质心并将其转换为树结构,结合树编辑距离进行高效比较,并提供工具planeGraph2tree实现该方法。博文详细描述了方法原理、操作流程以及应用示例,展示了其在功能性非编码RNA分析中的实用性。

resnet7explorer的博客 111

用游标解决psql客户端内存oom溢出问题

当客户端向数据库发送请求时, 如果SQL的结果集很大, 可能会把客户端的内存打爆. 就算内存没有被打爆, 客户端接收结果集、后续对结果的逻辑处理也需要注意是否能异步进行, 否则可能会出现干等结果的情况.

熊出陌 1096

【Tessy】集成测试小白入门指导

本文详细介绍了如何进行集成测试的小白入门指导,从新建工程到设计用例,实现集成测试的过程详细步骤

qq_37282365的博客 1184

JVM中内存泄漏,内存溢出,OOM类型,栈溢出

目录 1 定义 2 内存泄漏的分类 3 Java内存回收机制 4 Java内存泄露引起原因 4.1 静态集合类引起内存泄露 4.2 监听器 4.3 各种连接 4.4 单例模式 1 定义 内存溢出 (out of memory),是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory; 内存泄露 (memory leak),是指程序在申请内存后......

上善若泪 5749

996引擎 - 读写变量性能测试

单轮100万次读写,取3轮平均耗时(毫秒),有效读取率均为100%,数值越小性能越优。

灵台方寸山斜月三星洞 244

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

JDBC 读取大量数据时的 ResultSet resultSetType 设置TYPE_FORWARD_ONLY

在创建PreparedStatement时,resultSetType参数设置的是TYPE_SCROLL_INSENSITIVE或TYPE_SCROLL_SENSITIVE, 这两个参数的共同特点是允许结果集(ResultSet)的游标可以上下移动。而默认的TYPE_FORWARD_ONLY参数只允许结果集的游标向下移动。 如果PreparedStatement对象初始化时resultSetT...

花花公子 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

java大量数据加载时resultSetType参数的设置 TYPE_FORWARD_ONLY

这两天的工作是将一1000万条数据库记录(10GB)加载到内存中,加载到500多万条记录的时候,就报了OOM(内存不足)。解决了所有外围问题后,再运行还是这个问题无法加载全部数据。仔细研究了之前从未碰过的底层访问数据库的代码。 在创建PreparedStatement时,resultSetType参数设置的是TYPE_SCROLL_INSENSITIVE或TYPE_SCROLL_SENSITIVE

10km的专栏 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

别再让MySQL大查询搞崩你的JVM了:实测流式查询与游标查询的避坑指南

本文深入探讨MySQL流式查询与游标查询在处理海量数据时的性能差异与避坑策略。通过实测数据对比,揭示传统查询的内存陷阱,并提供优化配置建议,帮助开发者有效降低JVM内存占用,提升系统稳定性。特别针对高并发场景,给出动态调整fetchSize的实用方案。

weixin_33672109的博客 366

【JVM】工作中JVM注意事项

JVM学习(一)---Java内存区域与内存溢出异常(一)基本介绍(二)运行时数据区域基本介绍(1)程序计数器(2)Java虚拟机栈(3)本地方法栈(4)Java堆(5)方法区方法区也被称为永久代。方法区和永久代的区分:常用参数为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) 呢?(6)运行时常量池(7)直接内存(四)HotSpot虚拟机对象对象的创建Step1:类加载检...

weixin_44823875的博客 465

深入解析mysql-connector-java:从核心原理到生产环境调优实战

JDBC(Java Database Connectivity)是Java语言访问数据库的标准API,它定义了应用程序与数据库交互的通用接口。其核心原理是通过驱动管理器(DriverManager)加载特定数据库的驱动实现,建立网络连接并封装数据库协议,将SQL操作转换为底层网络通信。这项技术的价值在于实现了Java应用与多种关系型数据库的解耦和标准化访问,是构建企业级数据持久层的基石。在实际工程中,JDBC驱动的高效配置直接影响着应用的性能与稳定性,特别是在高并发、大数据量场景下。以MySQL官方驱动my

weixin_30876945的博客 384

MyBatis核心功能与实战:从JDBC到动态SQL

MyBatis作为Java领域主流的SQL映射框架,通过解耦SQL与Java代码、自动化参数映射和结果集处理,显著提升了数据库开发效率。其核心原理基于XML/注解配置的SQL模板引擎,配合动态SQL能力可灵活应对复杂查询场景。在技术价值层面,MyBatis既保留了JDBC级别的性能控制,又通过插件机制支持二级缓存、分页等扩展功能。典型应用场景包括高并发CRUD操作、多表关联查询以及需要精细控制SQL的生产系统。特别是在处理动态条件查询时,OGNL表达式驱动的<where>/<if>标签组合,比传统JDBC拼

weixin_34262482的博客 404

数据库交互全链路实战:通用封装、批量优化与动态查询三大核心模块

本文提供了一套完整的数据库交互解决方案。从环境搭建到安全配置,重点介绍了通用操作类封装、批量插入优化和动态查询构建三大核心模块。通过连接池管理、预处理语句防注入、分批次提交等技巧,有效解决了性能与安全问题。特别强调事务控制规范与异常处理机制,避免后期重构风险。文章还包含分页查询实现和常见错误排查方法,为开发者提供从零搭建到性能优化的全链路指导,适用于不同规模项目的数据库层标准化建设。

小赵的博客 257

2026年Java面试转型:从八股背诵到场景化问题解决能力

在Java技术领域,掌握核心原理如JVM内存模型和并发编程是构建系统性能优化的基础。理解这些原理有助于在分布式架构下进行技术选型,提升系统吞吐量与稳定性。随着AI大模型与云原生技术的普及,Java开发者需要将传统知识应用于实际业务场景,例如在高并发查询服务中排查数据错乱问题,或设计缓存策略以平衡性能与成本。本文通过分析HashMap线程安全特性和秒杀系统架构设计,探讨如何将零散知识点串联成解决实际问题的能力框架,应对面试中从知识点验证到场景化解决的转变。

weixin_30784501的博客 418

【DataX】使用案例和原理分析

DataX是阿里巴巴开源的一个异构数据源离线同步工具,用于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。任务提交命令:用户需要根据同步数据的数据源和目的地选择相应的Reader和Writer,并将Reader和Writer的信息配置在一个json文件中,然后执行命令提交数据同步任务即可。

weixin_44823875的博客 1万+

记一次OOM问题排查

记一次OOM问题排查

weixin_44981707的博客 1166
上一篇: JS布尔值(Boolean)转换规则
下一篇: ResultSet内存溢出OutOfMemory
qq_34412985
博客等级 码龄11年 143粉丝 983原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值