EasyExcel的设计

缘起:IDEA 提示内存不足,生成 idea use report,搜到一篇文章
如何使用intellij-idea内存分析工具排查内存泄漏问题 - 简书 (jianshu.com)
示例中,OutOfMemoryError 的原因,

  1. 最大原因是:内存配置太小
  2. 其次才是, 和 list=new ArrayList() 比 list.clear()更耗内存的问题

list=new ArrayList() (回收旧list 内存空间,分配新list 内存空间)
list.clear()(array[i]=null,复用 list 内存空间)

由 list 清空的方式,想起 EasyExcel 示例代码中,使用 分配操作使用 Field list = new ArrayList 方式,一时搞不清 EasyExcel Field list 是否能确保垃圾回收,回答为是



Q:SpringBoot IOC 容器管理 单例类,但为什么 EasyExcel 没有加入 SpringBoot 的管理?

A:EasyExcel 、Slf4J 和 SpringBoot 的处理方式是一样的,静态工厂作为入口,提供简单、一致且易于使用的接口,同时隐藏底层实现的细节

// 方法内
EasyExcel.read(file.getInputStream(), reqClz, customListener)  
        .sheet()  
        .headRowNumber(Objects.isNull(headRowNumber) ? 1 : headRowNumber)  
        .doRead();

// Field
private static final Logger LOG = LoggerFactory.getLogger(SFTPUtil.class);
// 方法内
LOG.error("SFTPUtil.connect error",e);


// SpringBoot 启动类
@SpringBootApplication  
public class MyApplication {  
  
    public static ConfigurableApplicationContext applicationContext;  
  
    public static void main(String[] args) {  
        applicationContext = SpringApplication.run(ReconciliationApplication.class, args);  
    }  
}

Q:EasyExcel 如何确保 一次性千万行数据的垃圾回收?

A:

  1. EasyExcel 的工作:
    工厂 EasyExcelFactory 给 每个 Excel Sheet 构建一个上下文 ExcelReaderSheetBuilder,
    读取器 ExcelReader 使用 执行器 ExcelExecutor 解析 XML 格式数据,解析事件处理器 DefaultAnalysisEventProcessor 获取单行数据
    监听器ModelEventListener 用 转换器 Converter 转换字段类型,再调用 自定义监听器 AnalysisEventListener 暂存分批保存Excel数据

ref:
https://www.yuque.com/easyexcel/doc/gpaz17
easyexcel的源码简单分析_12476320的技术博客_51CTO博客

  1. 按行处理 Excel 数据,在常用的读取校验保存场景下,AnalysisEventListener类 内必须定义一个 List属性 暂存解析到的数据,以减少数据库IO
    不加入Spring 容器管理,List属性 更安全易用,每次使用new 一个 AnalysisEventListener,也更便于 一次性千万行数据 的垃圾回收

引申:
SpringBoot RESTful 响应的大量数据,如 List 包装的那些数据,如何确保可以被垃圾回收?
解释:这些数据都是方法内的数据,在 List 不会再被传递,即 List 序列化成 JSON 的方法调用结束后,方法的局部变量和栈帧将被销毁,这也包括对 List 实例的引用。垃圾收集器会找出不被引用的对象,并回收这些不被引用对象占用的内存空间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
后端技术 - 基础框架:Java8 & Spring Boot & Maven - 数据库:Mysql 等 - 鉴权框架:Spring Security OAuth2 - 缓存框架:Redis & Redisson - 持久层框架:Mybatis Plus - 日志记录:Logback - 工作流框架:Flowable - 其他依赖:Lombok、Kaptcha、EasyExcel 等 ### 前端技术 - vue , vuex , vue-router - elementui - vue-element-admin - vue-form-making - mock ## 主要实现内容 1. 前后分离开发,前后端可以独立部署,也可以合并部署 2. `我的流程`、`系统管理`、`示例管理`、`流程管理`、`监控管理` 3. `功能权限`,`菜单权限`、`按钮权限`细粒度配置 4. `数据权限`,注解实现或数据库配置实现 5. `我的流程` 包含 `我的汇总`、`发起流程`、`我的待办`、`我的待阅`、`我的已办`,`流程管理` 包含 `表单设计`、`流程设计`、`流程定义`、`流程管理`、`任务管理`,`任务执行` 包含 `提交`、`抄送`、`转办`、`委派`、`终止`、`退回`(已实现退回并行网关节点、子流程退回)、`(批量)已阅` 等 流程设计约定: - 发起者启动流程后若要自动完成第一个用户任务,则第一个 `userTask` 的 `id` 要定义为`__initiator__`,若涉及流程表单,则可设置`__initiator__`的任务表单 `formKey` 与流程表单相同 - 如果涉及并行网关,并行网关需成对出现,且发散节点要以 `_begin` 结尾,汇聚节点要以 `_end` 结尾,可以嵌套但不能交叉嵌套,这样就能确保可以退回到并行网关的单个节点上(不会退回到并行网关的其他分支) - 如果流程涉及业务主键 `businessKey`,流程设计时加入 `流程扩展属性` 即可 ```xml <extensionElements> <flowable:properties> <flowable:property name="showBusinessKey" value="true" /> </flowable:properties> </extensionElements> ``` - 流程设计可参考 `zjmzxfzhl/zjmzxfzhl-admin/src/main/resources/processes_test` 下的流程 - 自定义表单使用 `MIT` 开源的 [FormGenerator](https://gitee.com/mrhj/form-generator),后续我也会进行更深层次的封装,目前已优化可以支持响应式布局 6. `Redis` 分布式锁,可实现交易防重发等业务场景 7. `App` 开发示例,包含:注册、登录、获取用户信息等 8. 代码生成器,包含前端和后端 9. 定时任务、异步任务线程池管理 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值