`
bluestar
  • 浏览: 376485 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)POI导出Excel文件与JVM内存的关系

    博客分类:
  • java
阅读更多

最近的一个项目需要导出大数据量的Excel文件,我使用了POI做为底层的Excel导出API。
在实际使用中得到一点小小体会,与大家分享一下。
测试数据:
数据记录长度:24字段/记录
字段大小:2个中文字/字段
JVM内存实际支持导出的记录数:11000条记录/64M
JVM内存配置到1024M时,可以导出此类数据10W条以上,大家可以参考此数据来配置自己的Excel数据量和JVM内存,以达到效果最优。

附:JVM内存配置说明

查看当前JVM的内存使用情况
System.out.println(Runtime.getRuntime().totalMemory()/(1024*1024) + "M");
System.out.println(Runtime.getRuntime().maxMemory()/(1024*1024) + "M");
System.out.println(Runtime.getRuntime().freeMemory()/(1024*1024) + "M");


如何获得JVM的最大可用内存

在命令行下用 java -XmxXXXXM -version 命令来进行测试,然后逐渐的增大XXXX的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息。

实际发现版本上有细微差别的JDK最大容许内存值都不尽相同,因此在实际的应用中还是要自己试验一下看到底内存能达到什么样的值。

通过这个表想说明的是,如果你的机器的内存太多的话,只能通过多运行几个实例来提供机器的利用率了,例如跑Tomcat,你可以多装几个Tomcat并做集群,依此类推。

以下引用地址:http://blog.csdn.net/tyrone1979/archive/2006/09/25/1274458.aspx

JVM内存的调优

 

1. Heap设定与垃圾回收
Java Heap分为3个区,Young,Old和Permanent。Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象,本文不讨论该区。
JVM的Heap分配可以使用-X参数设定,

 

-Xms
初始Heap大小
-Xmx
java heap最大值
-Xmn
young generation的heap大小
JVM有2个GC线程。第一个线程负责回收Heap的Young区。第二个线程在Heap不足时,遍历Heap,将Young 区升级为Older区。Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。
为什么一些程序频繁发生GC?有如下原因:
l         程序内调用了System.gc()或Runtime.gc()。
l         一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。
l         Java的Heap太小,一般默认的Heap值都很小。
l         频繁实例化对象,Release对象。此时尽量保存并重用对象,例如使用StringBuffer()和String()。
如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态。许多Server端的Java程序每次GC后最好能有65%的剩余空间。
经验之谈:
1ServerJVM最好将-Xms-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx1/3[2]
2.一个GUI程序最好是每1020秒间运行一次GC,每次在半秒之内完成[2]
 
注意:
1.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作。
2.Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。
 
2.Stack的设定
每个线程都有他自己的Stack。

 

-Xss
每个线程的Stack大小
Stack的大小限制着线程的数量。如果Stack过大就好导致内存溢漏。-Xss参数决定Stack大小,例如-Xss1024K。如果Stack太小,也会导致Stack溢漏。
3.硬件环境
硬件环境也影响GC的效率,例如机器的种类,内存,swap空间,和CPU的数量。
如果你的程序需要频繁创建很多transient对象,会导致JVM频繁GC。这种情况你可以增加机器的内存,来减少Swap空间的使用[2]。
4.4种GC
第一种为单线程GC,也是默认的GC。,该GC适用于单CPU机器。
第二种为Throughput GC,是多线程的GC,适用于多CPU,使用大量线程的程序。第二种GC与第一种GC相似,不同在于GC在收集Young区是多线程的,但在Old区和第一种一样,仍然采用单线程。-XX:+UseParallelGC参数启动该GC。
第三种为Concurrent Low Pause GC,类似于第一种,适用于多CPU,并要求缩短因GC造成程序停滞的时间。这种GC可以在Old区的回收同时,运行应用程序。-XX:+UseConcMarkSweepGC参数启动该GC。
第四种为Incremental Low Pause GC,适用于要求缩短因GC造成程序停滞的时间。这种GC可以在Young区回收的同时,回收一部分Old区对象。-Xincgc参数启动该GC。
4种GC的具体描述参见[3]。
 
参考文章:
2. Performance tuning Java: Tuning steps
3. Tuning Garbage Collection with the 1.4.2 JavaTM Virtual Machine .
原文http://jimjiang.iteye.com/blog/117532
分享到:
评论
1 楼 bulargy 2008-12-09  
太强大了,正好解决了我碰到的问题。

相关推荐

    java解决大批量数据导出Excel产生内存溢出的方案

    在Java开发中,当面临大批量数据导出到Excel文件时,可能会遇到内存溢出的问题。这是因为Excel文件格式本身的设计,以及Java默认处理大数据的方式,可能导致内存占用过高,尤其是在一次性加载大量数据到内存中进行...

    基于Java反射机制的POI实现Excel数据导入_导出.pdf

    在本文中,我们使用了POI组件来实现Excel文件的操作,并采用Java反射机制来实现数据库与Excel文件之间的数据交互。同时,我们还使用了自定义注解来描述Excel文件的结构,并使用Java反射机制来读取Excel文件的数据。 ...

    Java Poi 写Excel文件 (Excel 2007 xlsx)

    本工具可以将Oracle数据库中的指定表导出为Excel 2007 xlsx 格式文件,经过测试最大上限为120000条数据,实际情况据JVM内存而定。压缩包含包含源代码与编译后的文件。 详情请查看:...

    数据库大量数据导出Excel

    POI3.8版本之前的版本处理大量数据的导出Excel效果不是很理想,主要在与Excel2003版本单个Sheet的行限制为65536,大量数据的导出得分多个Sheet,针对这一点,客户就不会满意。其次,在实验过程中,大数据量的导出很...

    andriod 导出 excel

    在Android平台上,导出Excel文件是一项常见的需求,特别是在开发企业级应用或数据分析工具时。Excel是一种流行的电子表格格式,由Microsoft公司开发,广泛用于数据管理、分析和共享。Android系统虽然原生不支持直接...

    excel导入导出性能优化

    1. **内存管理**:Excel文件可以包含大量数据,当导入到程序或导出至文件时,这些数据需要在内存中进行处理。内存消耗是性能优化的关键因素,因为过高的内存占用可能导致JVM进程崩溃或者系统响应速度减慢。 2. **...

    注解反射导出Excel自定义中文表头

    在Java编程中,导出Excel数据是一项常见的任务,特别是在数据处理和报表生成的场景下。本文将深入探讨如何使用注解反射技术来实现Excel自定义中文表头的导出,结合数据库查询的数据,以实现更加灵活和人性化的数据...

    POI -ExcelToXml所需的jar包

    标题 "POI - ExcelToXml所需的jar包" 暗示了这个压缩包包含了用于将Excel文件转换为XML格式所需的一些关键Java库。POI是一个流行的Apache开源项目,专门用于处理Microsoft Office格式,如Excel。在Java编程中,POI库...

    CSV大数据分批并压缩导出

    在处理大数据时,直接使用像Apache POI或JXL这样的库来一次性导出所有数据到Excel文件可能会遇到内存溢出问题。这是因为这些库在内存中构建整个工作簿模型,当数据量过大时,所需内存会迅速增加,可能导致Java虚拟机...

    解决Java导入excel大量数据出现内存溢出的问题

    这是因为POI在操作Excel文件时,会将文件内容全部加载到JVM内存中。一旦数据量超过JVM设置的内存上限,就会出现内存溢出。 一个解决思路是利用逗号分隔值(CSV)格式替代Excel文件格式。CSV是一种简单的文本文件...

    java 导出 excel 高性能框架 iexcel 获取文件字节流内容.pdf

    - **SXSSF模式写入**:使用SXSSF模式写入Excel,该模式是Apache POI库提供的一个内存效率更高的流式API,同样避免了大文件导致的内存溢出问题。 - **基于注解的编程**:通过注解,开发者可以更灵活地定义Excel的...

    (转)大数据量的excel文件读取——2003及之前版本(含代码及示例)

    在IT行业中,处理大数据量的Excel文件是一项常见的任务,特别是在数据分析、报表生成和数据导入导出等场景。本文主要探讨如何高效地读取2003及之前版本的Excel文件,这些版本通常采用.BIFF(Binary Interchange File...

    java向excel 写入海量数据内存溢出问题的解决.pdf

    在Java中,向Excel写入海量数据时可能会遇到内存溢出的问题,特别是在使用Apache POI库处理Excel文件时。这是因为POI默认会将整个工作簿加载到内存中,当数据量巨大时,内存消耗非常快,导致Java虚拟机(JVM)内存...

    java导出word文档相关jar

    **使用Apache POI导出Word文档** 1. **初始化**: 首先,你需要导入必要的Apache POI依赖,这两个jar文件提供了创建和操作Word文档所需的类和方法。在Java代码中,你可以通过以下方式导入: ```java import org....

    POI3.8中 大数据量的处理.pdf

    然而,在POI的早期版本中,如HSSFWorkbook,处理大量数据时可能会遇到内存限制问题,因为它们会将整个工作簿保留在内存中,这可能导致Java虚拟机(JVM)的Out Of Memory (OOM)错误。为了解决这个问题,POI 3.8 引入...

    Plsql操作excel.pdf

    总结来说,通过结合使用Oracle的UTL_FILE包和Java存储过程(利用Apache POI),可以在金融商贸领域实现对Excel数据的高级操作,如数据导入导出、报表生成和分析,同时保持与数据库的紧密集成。这种方法对于处理大量...

    自定义Excel解析框架源码

    5. **批量处理**:对于大数据量的Excel文件,框架应支持高效的批量处理,避免一次性加载整个文件到内存中,以防止内存溢出。 6. **错误处理**:提供详细的错误报告和日志记录,帮助开发者快速定位和解决问题。 7. ...

    excel技术,Java架构师面试资料

    此外,一些开源库如Apache POI和JExcelAPI,使得Java程序员可以读写Excel文件,这对于数据导入导出和报表生成非常有用。 2. **Java技术**:作为Java架构师,深入理解Java语言的核心特性至关重要,包括面向对象编程...

Global site tag (gtag.js) - Google Analytics