网站首页 > 技术文章 正文
异常说明
最近在项目中使用mybatis批量往mysql里面插入大量数据时总是报内存溢出的问题:java.lang.OutOfMemoryError: Java heap space。
异常分析
出现这个错误最直观的原因就是Heap size的值不够大,需要在JVM启动的时候将Heap size的值设置的大一些,但这个并不是根本可靠的解决方法,如果数据量更大的话那我们是不是得设置更大的Heap size了,谁能保证你设置的Heap size就一定够用呢,还是得从代码的角度去分析解决这个问题。
分析代码后发现有个地方存在往mysql数据库里同时插入大量数据的情况(估计有上百万条记录),从而导致内存溢出。那么既然是因为一次性插入的数据量太大了,那么可以考虑分批次插入数据,时间可能会慢一些了,但是应该可以避免内存溢出的问题了。
异常解决
上面我们分析到如果一次性插入的数据量太大的话可以考虑分批次插入数据,当然一次插入的数据量要把握好,太多了还是会内存溢出,太少的话会导致数据录入时间增加很多,所以要找一个平衡的数量,这里我选择一次插入1000条数据,改造后的代码如下:
//设备数据量较大,一次性全部插入容易引起堆内存溢出问题(java.lang.OutOfMemoryError: Java heap space)
//因此采用分批插入数据的方式
int batchCount = 1000; //每批插入数量
int batchLastIndex = batchCount;
List<Device> shareList = new ArrayList<>();
for (int index = 0; index < devices.size(); ) {
if (batchLastIndex >= devices.size()) {
batchLastIndex = devices.size();
shareList = devices.subList(index, batchLastIndex);
break;
} else {
shareList = devices.subList(index, batchLastIndex);
index = batchLastIndex;// 设置下一批下标
batchLastIndex = index + (batchCount - 1);
}
System.out.println("当前插入的这一批数据的索引:"+index);
deviceExMapper.insertBatch(shareList);
}
System.out.println("最后一部分数据");
if (shareList.size()>0) {
deviceExMapper.insertBatch(shareList);
}
这样处理以后就没有出现内存溢出的问题了。
猜你喜欢
- 2024-10-12 SpringBoot执行jar报错java.lang.OutOfMemoryError_指定内存大小
- 2024-10-12 几种内存溢出(内存溢出类型)
- 2024-10-12 JVM优化:实战OutOfMemoryError异常
- 2024-10-12 JVM 在遇到OOM(OutOfMemoryError)时生成Dump文件的三种方式
- 2024-10-12 线上故障排查全套路,总有一款适合你
- 2024-10-12 面试被问到“零拷贝”!你真的理解吗?
- 2024-10-12 面试夺命三问之《内存溢出和逃逸分析》
- 2024-10-12 阿里面试官:Exception和Error有什么区别?
- 2024-10-12 Eclipse运行大量文件异常OutOfMemoryError: GC overhead limit
- 2024-10-12 记一次线上内存异常排查实战(线上内存泄漏如何定位)
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)