mybatis拼接sql导致的oom报错 GC报错

报错1:mybatis拼接过多

java 复制代码
java.lang.OutOfMemoryError: GC overhead limit exceeded

具体报错:

java 复制代码
nested exception is org.apache.ibatis.builder.BuilderException:
Error evaluating expression 'ew.sqlSegment != null and ew.sqlSegment != '' and ew.nonEmptyOfWhere'.
Cause: org.apache.ibatis.ognl.OgnlException: 
sqlSegment [java.lang.OutOfMemoryError: GC overhead limit exceeded

一看报错内容,有builder,expression,sqlSegment,ognl,就可以推测出,应该是mybatis拼接条件太多,导致内存超了。例如条件in里,code太多,或者id太多。

oracle官方对 java.lang.OutOfMemoryError: GC overhead limit exceeded 解释如下:

java 复制代码
Exception in thread thread_name: 
java.lang.OutOfMemoryError: GC Overhead limit exceeded Cause: 
The detail message "GC overhead limit exceeded" indicates that 
the garbage collector is running all the time 
and Java program is making very slow progress. 
After a garbage collection, 
if the Java process is spending more than approximately 98% of its time doing garbage collection 
and if it is recovering less than 2% of the heap 
and has been doing so far the last 5 (compile time constant) consecutive garbage collections, 
then a java.lang.OutOfMemoryError is thrown. 
This exception is typically thrown 
because the amount of live data barely fits into the Java heap having little free space for new allocations.
 
Action: Increase the heap size. 
The java.lang.OutOfMemoryError exception for GC Overhead limit exceeded can be turned off with the command line flag -XX:-UseGCOverheadLimit.

大致意思是说:

频繁的进行内存回收(最起码已经进行了5次连续的垃圾回收),JVM就会曝出java.lang.OutOfMemoryError: GC overhead limit exceeded错误。

解决的办法是:

增加堆大小,启动脚本添加参数-Xmx1024m。

或者 关闭GC Overhead limit:-XX:-UseGCOverheadLimit

但由于这是代码本身引起,而非内存不够的问题。所以不建议去改动堆参数或者关闭GC上限。

具体参考

BuilderException OgnlException sqlSegment nonEmptyOfWher OutOfMemoryError:GC overhead limit exceeded_globalcoding的博客-CSDN博客

报错2:

占位符

===================分割线=======================

文章到此已经结束,以下是紫薯补丁

java.lang.OutOfMemoryError: GC overhead limit exceeded

nested exception is org.apache.ibatis.builder.BuilderException:

Error evaluating expression 'ew.sqlSegment != null and ew.sqlSegment != '' and ew.nonEmptyOfWhere'.

Cause: org.apache.ibatis.ognl.OgnlException:

sqlSegment [java.lang.OutOfMemoryError: GC overhead limit exceeded

Exception in thread thread_name:

java.lang.OutOfMemoryError: GC Overhead limit exceeded Cause:

The detail message "GC overhead limit exceeded" indicates that

the garbage collector is running all the time

and Java program is making very slow progress.

After a garbage collection,

if the Java process is spending more than approximately 98% of its time doing garbage collection

and if it is recovering less than 2% of the heap

and has been doing so far the last 5 (compile time constant) consecutive garbage collections,

then a java.lang.OutOfMemoryError is thrown.

This exception is typically thrown

because the amount of live data barely fits into the Java heap having little free space for new allocations.

Action: Increase the heap size.

The java.lang.OutOfMemoryError exception for GC Overhead limit exceeded can be turned off with the command line flag -XX:-UseGCOverheadLimit.

相关推荐
he___H20 小时前
关于Amazon S3; Status Code: 403; Error Code: 403 Forbidden问题
java·报错·minio
刘一说21 小时前
2026年Java技术栈全景图:从Web容器到云原生的深度选型指南(附避坑指南)
java·前端·spring boot·后端·云原生·tomcat·mybatis
独自归家的兔1 天前
Spring Retryable 注解完全指南:从入门到精通,让接口容错更简单
java·spring·mybatis
sunddy_x1 天前
MyBatis 与 SpringBoot 集成入门
spring boot·后端·mybatis
雨中飘荡的记忆1 天前
MyBatis插件模块详解
mybatis
hashiqimiya1 天前
mybatis搭建项目框架
java·spring·mybatis
计算机学姐2 天前
基于SpringBoot的美妆销售系统【个性化推荐算法+数据可视化统计+库存预警+物流信息】
java·vue.js·spring boot·后端·mysql·信息可视化·mybatis
while(1){yan}2 天前
Mybatis动态SQL
数据库·spring boot·sql·spring·java-ee·mybatis
雨中飘荡的记忆2 天前
MyBatis设计模式之装饰器、模版方法、策略模式
mybatis