首页 > 数据库 >同事写了一条 SQL,把 MyBatis 都干翻了。。

同事写了一条 SQL,把 MyBatis 都干翻了。。

时间:2023-12-06 10:56:54浏览次数:32  
标签:OOM 同事 Mybatis 内存 SQL MyBatis 溢出 引用

作者:Lxlxxx
链接:https://juejin.cn/post/7221461552343072828

前言

继上次线上CPU出现了报警,这次服务又开始整活了,风平浪静了没几天,看生产日志服务的运行的时候,频繁的出现OutOfMemoryError,就是我们俗称的OOM,这可还行!

频繁的OOM直接会造成服务处于一个不可用的情况,通过Skywalking查看链路调用,基本全报红了,基本处于一个瘫痪状态,因为生产该服务是分布式部署,运维当即立断对该服务进行重启,因为是B端的产品,先让公司业务能用起来了,保证服务的正常使用,然后紧急查看问题,当然这个问题就来到了我这里,既然分配给我了,咱高低给它查出来,并且修复了。

OutOfMemoryError出现的原因

先来了解下OutOfMemoryError出现的原因,无非就是两类堆内存空间不足、元空间不足

  1. 堆内存空间不足:意味着程序存在一直有引用的对象(强引用),主要对象在引用的状态就无法被GC回收,撑爆了-Xmx堆拓展的最大值,内存不足自然就会触发堆内存溢出。
  2. 元空间:Java 8引入了元空间概念,代替了之前堆的永久代,由于元空间属于堆外内存,不需要有对象引用,通过指针的方式表示类和元数据,之所以引用元空间就是一种JDK的升级优化,避免了永久代的内存溢出。

常见堆内存溢出的几种情况

  1. 查询数据库返回的数据量过大,加载到内存中导致内存溢出;
  2. 代码中出现死循环情况,导致大对象一直被引用不能被GC回收;
  3. 资源链接池、io流在使用完没有进行手动释放;
  4. 静态集合类里面存在引用对象,始终存在引用关系,没有进行清除;

以上属于常见的几种堆内存溢出的场景,当然有时候我们的遇到的问题都是稀奇古怪的问题,常见的问题总是很少能遇到…

推荐一个开源免费的 Spring Boot 实战项目:

https://github.com/javastacks/spring-boot-best-practice

现象分析

根据生产环境的报错日志来看,这边属于Mybatis报出的一个内存溢出情况,通过去看Mybatis源码发现,底层也是通过一些集合类来存放拼接的sql,那么当然也有可能出现堆内存溢出,而且在sql体积比较大的情况下,接收sql的集合就会变的非常大,如果回收不了那么就会导致内存溢出。

由于我们docker容器里面没有一些jstack、jmap的工具,并且dump文件也没有进行保存…导致我无法通过看线程高占用内存的对象,来分析具体是什么操作发生的内存溢出,这就难了… 于是只能去网上搜搜看了,没想到真的给到我一些启发,并且有点思路大概知道是哪里的问题。

文章来源于zzzzbw作者写一篇关于 惨遭DruidDataSource和Mybatis暗算,导致OOM ,很感谢

标签:OOM,同事,Mybatis,内存,SQL,MyBatis,溢出,引用
From: https://www.cnblogs.com/javastack/p/17879027.html

相关文章

  • 查找说明性弹性域SQL
    查找说明性弹性域:SELECTfnd_dfv.title,fnd_dfv.descriptive_flexfield_name,fnd_dfv.form_context_prompt,fnd_dfc.descriptive_flex_context_code,fnd_dfc.descriptive_flex_context_name,fnd_dfv.application_table_name,fnd_dfv.d......
  • sql 查询慢
    查询慢的原因网络CPUIO上下文切换系统调用生成统计信息锁等待时间是否向数据库请求不需要的数据减少IO确认应用程序是否在检索大量超过需要的数据:数据量大时排序时可能不使用索引排序 可能30%数据确认mysql服务层是否在分析大量超过需要的数据行不需要的......
  • hive执行sql报错 FAILED: Execution Error, return code 3 from org.apache.hadoop.hi
    前言:执行hivesql报错,sql逻辑是两个表左连接并将数据插入新的表中。报错信息:[ERROR]2023-12-0515:49:49.165+0800-executesqlerror:Errorwhileprocessingstatement:FAILED:ExecutionError,returncode3fromorg.apache.hadoop.hive.ql.exec.mr.MapredLocalTa......
  • mysql 索引优化
     MySQL索引优化是提高数据库性能的关键步骤之一。下面是一些建议,以帮助你优化MySQL索引:最左前缀原则:确保查询条件使用了索引的最左侧列。如果查询没有涵盖索引的最左侧列,索引将不会被使用。选择性原则:具有高选择性的索引(即返回结果集中较小部分的索引)通常更有效。使......
  • MySQL 优化
     以下是SQL查询的典型执行顺序:FROM和JOIN这里确定了要从哪些表中查询数据以及如何进行表之间的连接。WHERE过滤出不符合条件的记录。GROUPBY将来自多个记录的数据值分组为一个数据集或根据某些条件进行分组。HAVING在GROUPBY之后对分组进行过滤......
  • Docker部署MySQL
    一、简介MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件之一。二、搭建MySQL绿联DX4600......
  • Flask-SQLALchemy
    SQLALchemyorm,对象-关系映射,主要实现模型对象到关系型数据库的映射,orm提供一种面向对象的数据库的方式给开发者,不需要编写原生的sql语句也能操作数据库,实现了业务代码与底层数据的解耦优势:1.对数据库操作转为对类/对象的属性和方法的操作,字段--对象数据,sql关键字--操作方法......
  • docker创建mysql集群
    一、创建mysql的节点目录#创建第一个节点mkdir/home/mysql-cluster/node1cd/home/mysql-cluster/node1mkdirconfdatafileslog#创建第二个节点mkdir/home/mysql-cluster/node2cd/home/mysql-cluster/node2mkdirconfdatafileslog#创建第三个节点mkdir/ho......
  • SQL 数据库语句- 创建和管理数据库
    SQLCREATEDATABASE语句SQLCREATEDATABASE语句用于创建一个新的SQL数据库。语法CREATEDATABASE数据库名称;示例以下SQL语句创建了一个名为"testDB"的数据库:CREATEDATABASEtestDB;通过这个简单的语句,你可以成功地创建一个名为"testDB"的数据库。记得在实......
  • 数据库总结复习(sql应用题 二)
    目录前言关系代数关系间运算条件表达式使用案例语法树例子前言本文针对考纲上的30分sql应用题所涉及到的知识进行归纳总结。分为两篇文章,本篇为关系代数相关知识点。关系代数关系间运算关系和关系之间需要用到以下关系运算符:其中,连接从连接条件上分,等值连接,非等值连......