小G最近搞一个导出excel项目,但是数据量比较多导出来tomcat内存狂飙,开始使用xssf内存狂升,后来使用sax还好点,但是
行数到5万左右,就2G,
第一步骤定位:liunx上面使用jmap -histo |head -30

可以查到使用内存最多是C和1,2,c是char[] ,1,2为xml的解析,那就可以看到时poi在解析过程中使用
第二步,找到问题后对问题进行分析
分析结果如下:
自测过程中数据问题:

解析方法 excel行数 内存情况
SXSSFWorkbook 5万行 2-4G内存
XSSFWorkbook 几千行 G级别反正内存消耗很大

第三步解决思路:
1、新增多个sheetname效果虽然好点,但是内存还是不怎么样在执行到10万左右,该方不可行;
2、分多个文件,5万-6万到2G,应该可以;
3、调用gc进行垃圾回收;
4、加锁共享锁lock,因为执行多个的话,就会2G的倍数,所以加一个锁,针对服务器加锁,其实在读取的时候内存比较大,但是这个是瞬间的,(如果数据不超过1万条,是可以没有问题,不用加锁),这样就可以同时执行多个文件进行导出操作
5,读取的时候使用sax进行读取数据

 public static Lock lockPOItool = new ReentrantLock();// 锁对象public static  void poi(){ Boolean isLockBoolean =false;if(lockPOItool.tryLock(5l, TimeUnit.MINUTES){isLockBoolean=true;//获取锁成功}XSSFWorkbook xssfworkbook = null;SXSSFWorkbook workbook = null;SXSSFSheet sheet = null;sheetName =  null ;fileName = null;sheetName="根据业务去划分生成多excel";fileName=sheelNameCount.toString()+fileName;FileInputStream fileInputStream =new FileInputStream(path);//原来的地址SXSSFCell cell=null;XSSFSheet xssheet=null;POIFSFileSystem pfs =null;try{//如果有文件说明以前新建过直接进行追加Boolean  isFrist = new File(path+ fileName).exists();if(i!sFrist){workbook = new SXSSFWorkbook();sheet = workbook.createSheet(sheetName);SXSSFRow row = sheet.createRow((short) 0);cell = row.createCell((short) 0);//如果有标题创建标题rowNum = sheet.getLastRowNum() + 1;//有标题+1从第二行进行}else{//追加操作的pfs = new POIFSFileSystem(fileInputStream);EncryptionInfo encInfo = new EncryptionInfo(pfs);Decryptor decryptor = Decryptor.getInstance(encInfo);decryptor.verifyPassword(pwd);//读取加密的这个是追加的方法 xssf解密,然后读取到sxssf里面InputStream pfsInputStream=decryptor.getDataStream(pfs);xssfworkbook = new XSSFWorkbook(pfsInputStream);pfsInputStream.close();pfs.close();xssheet = xssfworkbook.getSheet(sheetName);rowNum = xssheet.getLastRowNum() + 1;workbook = new SXSSFWorkbook(xssfworkbook,-1);//-1就是不在使用内存sheet=workbook.getSheet(sheetName);}//while(rowNum<50){//数据的存放SXSSFRow row = sheet.createRow(rowNum);row.createCell(0).setCellValue(“”“”);//row.createCell(1).setCellValue(“”“”);////官网说这个在(xssfworkbook,-1);有内存中使用,反正这个地方使用也可以((SXSSFSheet)sheet).flushRows(dataModels.size()-dataModelsInde);rowNum++;}FileOutputStream outBuildE=null;try{outBuildE = new FileOutputStream(path + filename);outBuildE.flush();workbook.write(outBuildE);outBuildE.close();workbook.dispose();}catch(Exception  e){}xssfworkbook.close();workbook.dispose();  }catch(Exception e){}finally{workbook=null;xssfworkbook=null;sheet=null;cell=null;xssheet=null;pfs=null;gcPoi();//缓存if(isLockBoolean){lockPOItool.unlock();}catch(Exception e){}}//手动清空下缓存  private void gcPoi(String msg) {try {Runtime.getRuntime().gc();}catch(Exception e){}}

官方的接口如下3.8大家可以看下

public static void main(String[] args) throws Throwable {SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to diskSheet sh = wb.createSheet();for(int rownum = 0; rownum < 1000; rownum++){Row row = sh.createRow(rownum);for(int cellnum = 0; cellnum < 10; cellnum++){Cell cell = row.createCell(cellnum);String address = new CellReference(cell).formatAsString();cell.setCellValue(address);}}// Rows with rownum < 900 are flushed and not accessiblefor(int rownum = 0; rownum < 900; rownum++){Assert.assertNull(sh.getRow(rownum));}// ther last 100 rows are still in memoryfor(int rownum = 900; rownum < 1000; rownum++){Assert.assertNotNull(sh.getRow(rownum));}FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");wb.write(out);out.close();// dispose of temporary files backing this workbook on diskwb.dispose();
}
}

官方如下:

    public static void main(String[] args) throws Throwable {SXSSFWorkbook wb = new SXSSFWorkbook(-1); // turn off auto-flushing and accumulate all rows in memorySheet sh = wb.createSheet();for(int rownum = 0; rownum < 1000; rownum++){Row row = sh.createRow(rownum);for(int cellnum = 0; cellnum < 10; cellnum++){Cell cell = row.createCell(cellnum);String address = new CellReference(cell).formatAsString();cell.setCellValue(address);}// manually control how rows are flushed to disk if(rownum % 100 == 0) {((SXSSFSheet)sh).flushRows(100); // retain 100 last rows and flush all others// ((SXSSFSheet)sh).flushRows() is a shortcut for ((SXSSFSheet)sh).flushRows(0),// this method flushes all rows}}FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");wb.write(out);out.close();// dispose of temporary files backing this workbook on diskwb.dispose();}

excel百万数据处理,内存溢出问题,Java常见溢出问题解决相关推荐

  1. 解决POI读取Excel百万级内存溢出问题

    使用传统poi来操作大数据量的excel会出现内存溢出的问题,根据各种资源,亲试了一个可用工具类,附代码如下: 一.基于eventusermodel的excel解析工具类 package com.ta ...

  2. Java常见内存溢出(OOM)解决方案

    Java 常见内存溢出(OOM)解决方案 一,jvm内存区域   1,         程序计数器 一块很小的内存空间,作用是当前线程所执行的字节码的行号指示器. 2,         java栈 与 ...

  3. Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

    导致OutOfMemoryError异常的常见原因有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据: 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收: 3.代码 ...

  4. Java常见的几种内存溢出及解决方法

    Java常见的几种内存溢出及解决方法[情况一]: java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),另 ...

  5. Java常见内存溢出异常分析

    Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等,而Hotspot jvm的实现中,将堆内存分为了三部分,新生代,老年代,持久带,其中持久带实现了规范中规定的方法区,而 ...

  6. Java 常见内存溢出异常与代码实现

    Java 堆 OutOfMemoryError Java 堆是用来存储对象实例的, 因此如果我们不断地创建对象, 并且保证 GC Root 和创建的对象之间有可达路径以免对象被垃圾回收, 那么当创建的 ...

  7. java代码耗尽内存_有关Java内存溢出及内存消耗的小知识

    内存溢出原理: 我们知道,Java程序本身是不能直接在计算机上运行的,它需要依赖于硬件基础之上的操作系统和JVM(Java虚拟机). Java程序启动时JVM都会分配一个初始内存和最大内存给这个应用程 ...

  8. 内存溢出几种常见的错误

    对于JVM的内存写过的文章已经有点多了,而且有点烂了,不过说那么多大多数在解决OOM的情况,于此,本文就只阐述这个内容,携带一些分析和理解和部分扩展内容,也就是JVM宕机中的一些问题,OK,下面说下O ...

  9. java heap space 什么意思_java内存溢出之Java heap space

    作为一个java程序员,大家都应该认识JVM.JVM作为java的核心,实在太重要了.而内存溢出又是程序员常遇到的错误之一,如果你对JVM的原理足够了解,那么解决这样的问题就不在是一件困难的事情. 关 ...

最新文章

  1. 系统科学丨钱学森:我对系统学认识的历程
  2. 游戏中的物理与数学(一):物体运动算法的实现
  3. 0726------Linux基础----------线程池
  4. python线程退出_python子线程退出及线程退出控制的代码
  5. 碎片化学习前端资料分享~
  6. 前端学习(3305):函数组件usermemo和usercallback
  7. 最短路径和距离及可视化——matlab
  8. 组策略 之 恢复默认组策略对象命令
  9. 西部数码linux云服务器,linux云服务器选择哪个版本
  10. 这些年,我们无法忘却的jQuery日历插件
  11. 【光学】干涉衍射仿真含Matlab源码
  12. 权限管理模块数据库设计
  13. 信息安全中最容易被忽略的软资产管理
  14. 自动配置的IPv4地址怎么取消
  15. 树莓派33/100 - Pico控制直流小马达,为智能避障小车提供动力
  16. Java 8 effectively final
  17. 有备无患——数据中心基础设施备品备件管理
  18. mbp网速很慢_macbook无线上网很慢怎么办 macbook无线上网很慢解决方法
  19. 河南省 建筑标准规范 合集
  20. 三星笔记本电脑光驱改SSD

热门文章

  1. CMU 动作捕获数据集
  2. 某公司雇我去别家公司面试,岗位职责是卖自家的软件
  3. 完爆体测计划【1000M、体前屈】
  4. 亚马逊预测2022年及未来五大技术趋势;四季酒店集团2023年全新私人飞机行程发布 | 美通社头条...
  5. 网络管理、ssh、日志管理、归档和文件传输、rpm
  6. pycharm科学模式
  7. pycharm conmunity 2022.1没有mange repositories,只能使用命令方式修改镜像源(长期可信)
  8. 迅为4412开发板官方店十一大促,乐享双重好礼
  9. python手机版下载教程-Python教学
  10. windows 10 中 java 设置path不起作用