问题背景及排查:Java内存优化之POI Excel(一)

其实除了内存调整,还做了策略上的调整,既然创建一整个数十万行的Excel比较耗内存,那我就分片创建呗,所谓分片就是将一个大的Excel分成几个小的Excel,然后打成Zip。

分片创建Excel

Talk is cheap, show me the code!

public String export() throws Exception {

List excelFileSplices = Lists.newArrayList();

if (pageable) {

// 可以分成几个Excel

int pageCount = this.dataList.size() / PER_SPLICE_SIZE + 1;

int index = 0;

while (index < pageCount) {

List dataSplices = this.dataList.subList(index * PER_SPLICE_SIZE,

Math.min(this.dataList.size(), (index + 1) * PER_SPLICE_SIZE));

String fileName = exportOne(dataSplices);

excelFileSplices.add(fileName);

index++;

}

} else {

String fileName = exportOne(this.dataList, ignoredProperties);

excelFileSplices.add(fileName);

}

log.info(excelFileSplices);

if (excelFileSplices.size() == 1) {

return excelFileSplices.get(0);

} else {

String zipFilePath = TMP_FILE + "/" + UUID.randomUUID().toString() + ".zip";

ZipArchiveOutputStream zipArchiveOutputStream = null;

InputStream is = null;

try {

zipArchiveOutputStream = new ZipArchiveOutputStream(new File(zipFilePath));

zipArchiveOutputStream.setUseZip64(Zip64Mode.AsNeeded);

for (String srcFilePath : excelFileSplices) {

File sourceFile = new File(srcFilePath);

ZipArchiveEntry zipArchiveEntry = new ZipArchiveEntry(sourceFile, sourceFile.getName());

zipArchiveOutputStream.putArchiveEntry(zipArchiveEntry);

is = new BufferedInputStream(new FileInputStream(sourceFile));

IOUtils.copy(is, zipArchiveOutputStream);

sourceFile.delete();

}

zipArchiveOutputStream.closeArchiveEntry();

} finally {

IOUtils.closeQuietly(is);

IOUtils.closeQuietly(zipArchiveOutputStream);

}

return zipFilePath;

}

}

其实策略实现比较简单,就是将数据全部撸到内存(其实这些数据也占不了多少内存,只是创建Excel的时候消耗了大量内存),然后在内存分页,分别创建Excel,最后将Excel达成Zip包上传到七牛。

不妥协的DaYe

WO: 以后下载清单会是压缩包了,会麻烦一点点...

DaYe:我们要这个就是为了简单吗 ,你还麻烦一点 ,你怎么好意思说啊...

WO: ......

不说了,继续改吧。

可见的效果

其实这种性能优化,最讨厌感觉上优化了,明明做了啊,但是到底优化了多少,是一点点,还是很多,还是适得其反呢?怎么能做到心中没点B数。

神奇的JConsole

Sun真是良心,除了JDK,还提供了很多很好的附加工具,还说只是试验品,软件附加的,但是其实很好用,而且很稳定。

什么是JConsole呢?在终端(Mac或者Windows)上输个jconsole就能看到,如图

image.png

图中com.zuihuibao.excel.ExcelOperator 34890是我启动的程序,可以选中它,然后连接。

image.png

点击不安全的连接,就可以看到各种你想看到的数据,比如当前内存大小,内存峰值等,我打算用它来测量我优化的实际效果。

image.png

PS,可能第一次你一直连不上,请在你的启动程序上加个参数

-Djava.rmi.server.hostname=localhost

image.png

java下载execl优化_Java内存优化之POI Excel(二)相关推荐

  1. Android 系统性能优化(55)---Android 性能优化之内存优化

    Android 性能优化之内存优化 前言 Android App优化这个问题,我相信是Android开发者一个永恒的话题.本篇文章也不例外,也是来讲解一下Android内存优化.那么本篇文章有什么不同 ...

  2. App性能优化(布局优化,线程优化,app瘦身优化,页面切换优化,App启动优化,内存优化)

    Android APP性能优化(最新总结) 在目前Android开发中,UI布局可以说是每个App使用频率很高的,随着UI越来越多,布局的重复性.复杂度也随之增长,这样使得UI布局的优化,显得至关重要 ...

  3. Lua性能优化—Lua内存优化

    原文链接https://blog.uwa4d.com/archives/usparkle_luaperformance.html 这是侑虎科技第236篇原创文章,感谢作者舒航供稿,欢迎转发分享,未经作 ...

  4. java中的softreference_Java中内存优化的SoftReference 和 WeakReference浅析

    一.引用对象类型定义 首先,引用对象在Java定义中有三种类型,从弱到强依次为:软引用.弱引用与虚引用,三种级别也各有所不同(软引用>弱引用).本文浅析下软引用与弱引用.大概的解释,软引用适合应 ...

  5. java解析json文件_Java性能优化:正确的解析JSON文件

    数据收集服务平均1小时OOM(java.lang.OutOfMemoryError: GC overhead limit exceeded)一次,发现都是在下载处理 JSON Atom Feed时OO ...

  6. 对于一些手机内存概念的思考、深入理解java的finalize,对于内存优化的小总结...

    2019独角兽企业重金招聘Python工程师标准>>> 最近在对手机性能做了一些小概念总结,方便对于自己的个人思考 Shallow Size: 对象本身占用的内存空间,不包含其引用的 ...

  7. android—性能优化2—内存优化

    文章目录 性能优化: 工具: memory profiler LeakCanary arthook epic 库 java内存管理机制 java 内存回收机制 Android内存管理机制 Dalvik ...

  8. Android App优化:内存优化、电量优化、网络优化等 (2)

    -- 优化专题: 整理一系列的专题:比如APK瘦身.插件化.程序架构.性能优化.自定义view.增量升级.移动开发各种技术解决方案等.   Android后期发展的五大趋势:一.性能优化:二.高级UI ...

  9. Android优化之内存优化倒计时篇

    本文来自网易云社区 作者:聂雷震 本篇文章介绍的内容是如何在安卓手机上实现高效的倒计时效果,这个高效有两个标准:1.刷新频率足够高,让用户觉得这个倒计时的确是倒计时,而不是幻灯片:2.不能占用太多的内 ...

  10. java和硬件交互_Java内存模型

    Java内存模型 我们常说的JVM内存模式指的是JVM的内存分区:而Java内存模式是一种虚拟机规范,真实并不存在 Java虚拟机规范中定义了Java内存模型(Java Memory Model,JM ...

最新文章

  1. android 代码获取图片信息吗,Android 通过网络获取图片的代码
  2. python opencv 人脸比对_Python3.5+openCv在Windows下利用LBP算法进行人脸识别并匹配
  3. Mysql系列(三)—— Mysql主从复制配置
  4. 同在服务器无响应,全部服务器无响应!!!
  5. 运行 ui5 serve 命令行报错的处理方法
  6. 中国古代历朝首都一览
  7. 使用dx命令在cmd环境下执行的正确方法,我用的版本android4.4.2,jdk1.8
  8. python程序下载腾讯企业邮箱附件_python收取邮件(腾讯企业邮箱)
  9. linux 下tar打包举例,Linux tar打包命令
  10. php temp 删除,c盘temp文件夹可以删除吗
  11. java登陆界面图片_java登陆界面如何插入背景图片
  12. 吉林农业大学计算机类考研,吉林农业大学考研难吗?一般要什么水平才可以进入?...
  13. 本地音乐如何导入apple_如何将自己的音乐添加到Apple Music
  14. linux网络本地发送lo性能,LINUX网络性能之管理工具三剑客
  15. ShopTalk第19集
  16. erlang底层c定时器设计-Erlang源码学习二
  17. 同样是后端程序员,你掌握如何用Grafana做出漂亮的可视化界面了吗?
  18. PVLAN (Private VLAN)
  19. 让div在body中居中显示
  20. html语言的title在哪,网页中title标题使用地方有哪些

热门文章

  1. HDU-2057(16进制的输入输出)
  2. CVPR2021目标检测和语义分割论文分类汇总 | 源码 |
  3. 重磅!国内首个三维重建系列视频课程,涉及SFM、立体匹配、多视图几何、结构光等...
  4. 真来了!已有高校正式通知:排查近5年硕博学位论文!
  5. Matlab实现批量修改文件名
  6. linux下wps的字体缺失解决方法
  7. JS执行一次任务与定期任务与清除执行
  8. Android App Architecture使用详解
  9. php文件加锁 lock_sh ,lock_ex
  10. springmvc中@PathVariable和@RequestParam的区别(百度收集)