Loading [MathJax]/jax/output/CommonHTML/config.js
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用XSSF的OutOfMemory或GC开销

是指在使用Apache POI库中的XSSF模块处理大量数据时,可能会出现内存溢出或垃圾回收开销过大的问题。

XSSF是Apache POI库中用于处理Excel 2007及以上版本(.xlsx格式)的模块。由于XSSF模块需要将整个Excel文件加载到内存中进行操作,当处理的数据量较大时,会占用大量的内存空间,导致OutOfMemory错误。另外,由于内存占用较大,垃圾回收器需要频繁进行垃圾回收操作,导致GC开销过大,影响程序的性能和响应速度。

为了解决这个问题,可以采取以下几种方法:

  1. 分批处理:将大量数据分成多个较小的批次进行处理,每次处理一部分数据,避免一次性加载整个Excel文件到内存中。可以使用POI库提供的Streaming API来实现分批处理,例如使用XSSFReader来逐行读取数据。
  2. 内存优化:优化代码中的内存使用,减少不必要的内存占用。例如,在处理大量数据时,可以使用缓存机制,将部分数据缓存到磁盘或数据库中,减少内存占用。
  3. 优化垃圾回收:调整JVM的垃圾回收参数,以减少GC开销。可以根据具体情况调整堆内存大小、新生代和老年代的比例、垃圾回收算法等参数。
  4. 使用SXSSF模块:如果只需要写入Excel文件而不需要读取,可以考虑使用POI库中的SXSSF模块。SXSSF模块采用流式写入的方式,不需要将整个Excel文件加载到内存中,可以有效减少内存占用和GC开销。
  5. 使用其他技术方案:如果对Excel文件的读写操作较为复杂或需要更高的性能,可以考虑使用其他技术方案,如使用Apache POI与BigMemory等内存缓存框架结合,或者使用专门的Excel处理库,如EasyExcel等。

总结起来,使用XSSF的OutOfMemory或GC开销问题可以通过分批处理、内存优化、优化垃圾回收、使用SXSSF模块或其他技术方案来解决。具体的解决方案需要根据实际情况进行选择和调整。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

大堆栈带来的高GC开销的问题

作者:晓_7611 来源:简书 当分配的内存量相对较小时,Go垃圾收集器(GC)工作得非常好,但是如果堆大小较大,GC最终可能会使用大量的CPU。在极端情况下,它可能无法跟上。 有什么问题?...支持ints的内存被释放,并可能在每个gc之后重新使用。但是我们的数据并不像我们预期的那样,虽然还没有崩溃。...如果我们可以避免分配的类型中的任何指针,它们不会导致GC开销,因此我们不需要使用任何堆外技巧。如果我们确实使用堆外分配,那么我们需要避免存储指向堆的指针,除非这些指针也被GC可见的内存引用。...- 如果您将日期和时间存储为字符串,那么可以解析它们并将日期或时间存储为整数。 - 如果你基本上需要存储大量的字符串,那么继续读下去… 假设我们存储了一亿个字符串。...我们通过这样做放弃的是为单个字符串释放内存的能力,并且我们增加了一些将字符串体复制到大字节片中的开销。 下面是一个演示这个想法的小程序。

80950

Go Action: 如何避免因为大堆产生的高GC开销

我们的输出在这里。在每次垃圾回收后,支持我们整数的内存都会被释放并可能被重新使用。所以,我们的数据并不像我们预期的那样,很幸运程序没有崩溃。...如果我们修改成使用通常分配的 []*int ,如下所示,就可以得到预期的结果。...如果我们能在分配的类型中避免使用指针,就不会造成GC的负担,从而无需使用任何奇技淫巧。如果我们使用非堆内存分配,则需要避免存储对堆内存的指针,除非这些内存也被GC可访问内存所引用。...如果你的字符串只取几种固定的值,可以考虑使用整数常量替代 2. 将日期和时间作为字符串存储的话,不妨将它们解析为整数并存储起来 3....这样做的坏处就是,丧失了slice 操作的便利性,slice 的修改变得特别复杂,我们为将字符串体复制到大的字节切片上增加了开销。 这里有一个小程序来演示这个想法。

6510
  • 记一次悲惨的 Excel 导出事件

    来源:http://t.cn/EGbiLHk 背景 分析过程 看看XSSF和HSSF的区别 解决方案 总结 ---- 背景 话说这个背景挺惨的,某系统使用了poi-ooxml-3.5-final做excel...起初使用该版本的poi的HSSF配合多线程生成excel,没有任何问题,后来改成了XSSF生成后上线,导出3w条数据时,cpu使用率达到了100%,内存达到了100%,打死了整个服务器!...img 可见eden空间的s0和s1已经无法交换了,eden空间已经完全打满,old空间也一样打满,yong gc和full gc都非常频繁,cpu自然使用率高了,不过不足以打满整个cpu!...由于问题出现在导出报表,并且已知升级了版本并且改成了单线程导出就解决了,同时之前使用HSSF的时候并没有出现问题,也证明了业务代码没有问题,问题出现在XSSF的版本和多线程上。...同时怀疑是poi-ooxml-3.5-FINAL内存泄露或内存管理出现的问题,那么其实不需要4g内存,在2g的内存下压榨到死看看heap中大量的对象是不是poi相关的就可以了。

    1.2K10

    JVM难学?那是因为你没认真看完这篇文章

    优缺点: 句柄访问方式:reference中存储的是稳定的地址,对象变更时只会改变句柄实例数据指针,引用本身不需要修改 指针访问方式:优点速度快,节省了指针定位时间开销 ---- 三:内存区域控制参数及对应溢出异常...开发过程中,或程序运行过程中每次遇到OutOfMemory异常或GC异常或StackOverflowError异常我们都是一堆参数乱配,都把值调大,只是大体知道是跟jvm内存分配有关,具体应该怎么调,...例:-XX:PermSize=20M -XX:MaxPermSize=20M 异常类型 OutOfMemoryError : 原因:常量过多,或代理反射等使用频繁 ---- 4.本机直接内存参数 -...这些参数就不起作用了,虚拟机会自动收集监控信息,动态调整这些参数以提供最合适的的停顿时间或者最大的吞吐量(GC自适应调节策略),而我们需要设置的就是-Xmx,-XX:+UseParallelOldGC或...,故采用并行垃圾回收器 -XX:+UseParallelGC或使用-XX:+UseParallelOldGC 8.5 降低停顿 使用CMS回收器,同时减少fullGC的次数 ---- 九、获取gc信息的方法

    42640

    STL中有哪些副作用或稍不注意会产生性能开销的地方?

    STL中稍不注意会产生性能开销的地方 STL容器的clear的时间复杂度不是O(1) 可能很多人都不在意,在使用STL容器的时候,潜意识里面将clear()成员函数视为常量时间复杂度O(1)的。...不管这次查找的开销大或不大吧。既然我们已经查找过一次key是否存在了,那么就把结果存储下来就好了。为什么要二次查询呢?...vector的[] 几乎没有开销,和那些关联容器不同。...而且我不鼓励在生产环境中使用会抛异常的函数。因为C++不同于java。java如果有未捕获或throw的异常,编译都过不了。而C++则不管。...所以如果你的代码不小心抛出了异常,而没被catch,那么就可能让程序core dump! sort给定义对象排序,可能存在对象拷贝的开销 STL中的sort()应该是一个高频使用的函数了。

    1.4K10

    JVM难学?那是因为你没认真看完这篇文章

    一、 句柄方式 (访问) 二、指针方式 (访问) 优缺点: 句柄访问方式:reference中存储的是稳定的地址,对象变更时只会改变句柄实例数据指针,引用本身不需要修改 指针访问方式:优点速度快,节省了指针定位时间开销...---- 三:内存区域控制参数及对应溢出异常 开发过程中,或程序运行过程中每次遇到OutOfMemory异常或GC异常或StackOverflowError异常我们都是一堆参数乱配,都把值调大,只是大体知道是跟...例:-XX:PermSize=20M -XX:MaxPermSize=20M 异常类型 OutOfMemoryError : 原因:常量过多,或代理反射等使用频繁 ---- 4.本机直接内存参数 -...这些参数就不起作用了,虚拟机会自动收集监控信息,动态调整这些参数以提供最合适的的停顿时间或者最大的吞吐量(GC自适应调节策略),而我们需要设置的就是-Xmx,-XX:+UseParallelOldGC或...,故采用并行垃圾回收器 -XX:+UseParallelGC或使用-XX:+UseParallelOldGC 8.5 降低停顿 使用CMS回收器,同时减少fullGC的次数 ---- 九、获取gc信息的方法

    40930

    调优 | Apache Hudi应用调优指南

    Off-heap(堆外)内存:Hudi写入parquet文件,需要使用一定的堆外内存,如果遇到此类故障,请考虑设置类似 spark.yarn.executor.memoryOverhead或 spark.yarn.driver.memoryOverhead...Spark 内存:通常Hudi需要能够将单个文件读入内存以执行合并或压缩操作,因此执行程序的内存应足以容纳此文件。...调整文件大小:设置 limitFileSize以平衡接收/写入延迟与文件数量,并平衡与文件数据相关的元数据开销。 时间序列/日志数据:对于单条记录较大的数据库/ nosql变更日志,可调整默认配置。...在这种情况下,请考虑通过 .bloomFilterFPP()/bloomFilterNumEntries()来调整Bloom过滤器的精度,以加速目标索引查找时间,另外可考虑一个以事件时间为前缀的键,这将使用范围修剪并显着加快索引查找的速度...GC调优:请确保遵循Spark调优指南中的垃圾收集调优技巧,以避免OutOfMemory错误。

    1.1K20

    JVM难学?那是因为你没认真看完这篇文章

    优缺点: 句柄访问方式:reference中存储的是稳定的地址,对象变更时只会改变句柄实例数据指针,引用本身不需要修改 指针访问方式:优点速度快,节省了指针定位时间开销 三:内存区域控制参数及对应溢出异常...开发过程中,或程序运行过程中每次遇到OutOfMemory异常或GC异常或StackOverflowError异常我们都是一堆参数乱配,都把值调大,只是大体知道是跟jvm内存分配有关,具体应该怎么调,...例:-XX:PermSize=20M -XX:MaxPermSize=20M 异常类型 OutOfMemoryError : 原因:常量过多,或代理反射等使用频繁 4.本机直接内存参数 -XX:MaxDirectMemorySize...这些参数就不起作用了,虚拟机会自动收集监控信息,动态调整这些参数以提供最合适的的停顿时间或者最大的吞吐量(GC自适应调节策略),而我们需要设置的就是-Xmx,-XX:+UseParallelOldGC或...:+UseParallelGC或使用-XX:+UseParallelOldGC 8.5 降低停顿 使用CMS回收器,同时减少fullGC的次数 九、获取gc信息的方法 9.1 -verbose:gc或者

    35320

    JVM难学?那是因为你没认真看完这篇文章

    指针访问方式:优点速度快,节省了指针定位时间开销 ---- 三:内存区域控制参数及对应溢出异常 开发过程中,或程序运行过程中每次遇到OutOfMemory异常或GC异常或StackOverflowError...例:-XX:PermSize=20M -XX:MaxPermSize=20M 异常类型 OutOfMemoryError : 原因:常量过多,或代理反射等使用频繁 ---- 4.本机直接内存参数 -...这些参数就不起作用了,虚拟机会自动收集监控信息,动态调整这些参数以提供最合适的的停顿时间或者最大的吞吐量(GC自适应调节策略),而我们需要设置的就是-Xmx,-XX:+UseParallelOldGC或...,故采用并行垃圾回收器 -XX:+UseParallelGC或使用-XX:+UseParallelOldGC 8.5 降低停顿 使用CMS回收器,同时减少fullGC的次数 ---- 九、获取gc信息的方法...  获取GC的频率和间隔 9.4 -XX:+PrintHeapAtGC  获取堆的使用情况 9.5 -Xloggc:D:\gc.log  指定日志情况的保存路径 ---- 十、jvm调优实战-tomcat

    53311

    关于CPU使用率飙升,我们需要了解什么?

    常听说计算密集型的程序是比较耗 CPU 使用率的。 3、CPU 与进程、线程有关系么? 现在分时操作系统是通过循轮方式分配时间片进行进程调度的,如果进程在等待或阻塞,不会造成 CPU 资源使用。...之前有个一个案例,for 循环从数据库查询数据集合,二次封装新的数据集合,这时如果量比较大时,内存没有足够的空间存储,那么 JVM 就会 GC 回收那些不再使用的数据,因此量大的时候,就会收到 CPU...起初使用该版本的poi的HSSF配合多线程生成excel,没有任何问题,后来改成了XSSF生成后上线,导出3w条数据时,cpu使用率达到了100%,内存达到了100% ? ? ?...可见eden空间的s0和s1已经无法交换了,eden空间已经完全打满,old空间也一样打满,yong gc和full gc都非常频繁,cpu自然使用率高了,不过不足以打满整个cpu!...由于问题出现在导出报表,并且已知升级了版本并且改成了单线程导出就解决了,同时之前使用HSSF的时候并没有出现问题,也证明了业务代码没有问题,问题出现在XSSF的版本和多线程上。

    5.2K32

    Confluence 6 垃圾收集性能问题 原

    这个需要额外的手工调整和测试,通常这个会降低系统的性能。 使用一个小的 heap 在不出现 OutOfMemory 错误的情况下,保持你的 heap 尽可能的小。...当你遇到了 OutOfMemory 错误,需要增加 heap 的时候,我们推荐你按照 512MB 到 1 GB 的顺序进行增加。...如果你还持续的获得 OutOfMemory 错误,那么你可以考虑再继续增加 512 MB 或者 1GB。你可以持续进行增加,直到你不再出现 OutOfMemory 错误。...手动清理 如果你按照上面的说明进行了操作后还遇到了一些困难,但是你还是希望能够提高系统的性能,我们推荐你使用Garbage Collection (GC) Tuning Guide 页面提供的方法。...查看你的垃圾收集日志 How to Enable Garbage Collection (GC) Logging 和使用类似  Chewiebug's GCViewer 工具来查看结果的日志。

    45030

    Spark编程技巧

    会让Spark其他阶段拥有更多的内存,从而减少了和磁盘的交互,进而加快作业的执行速度 内存不够时 内存不够时,使用 MEMORY_AND_DISK_SER 避免使用DISK_ONLY和后缀为_2的持久化方式...DISK_ONLY将rdd缓存在磁盘上,基于磁盘的读写会严重影响性能 后缀为_2的持久化方式,会将rdd复制一份副本,发送到其他节点上,数据复制和网络传输的性能开销较大 使用Kryo序列化 该种序列化方式会比默认的...调低spark.memory.fraction 如果因为GC导致outofmemory,很可能是老年代的内存较小,可以调低该参数 包冲突 将spark自带的包设置成provided,这样就可以使用spark...这个时候,有两种方式处理:不使用这些包,这样就将雷跳过去了;使用shade打包,改变包的名字,也可以将雷跳过去 yarn-client 选择了yarn-client模式, 因此是默认没有开启本地Driver...的gc log的, 为了更好应对出错时debug, 建议在本地export 因此是默认没有开启本地 Driver 的 gc log 的, 为了更好应对出错时 debug, 建议在本地 export SPARK_SUBMIT_OPTS

    26920

    SaaS-百万数据报表概述

    3 百万数据报表概述 3.1 概述 我们都知道Excel可以分为早期的Excel2003版本(使用POI的HSSF对象操作)和Excel2007版本(使用POI的XSSF操作),两者对百万数据的支持如下...已被GC的对象,反向查看分配的堆栈 3.2.2 Jvisualvm的位置 Jvisualvm位于JAVA_HOME/bin目录下,直接双击就可以打开该程序。...3.2.3 Jvisualvm的使用 Jvisualvm使用起来比较简单,双击点击当前运行的进程即可进入到程序的监控界面 ? 概述:可以看到进程的启动参数。...监视:左上:cpu利用率,gc状态的监控,右上:堆利用率,永久内存区的利用率,左下:类的监控,右下:线程的监控 线程:能够显示线程的名称和运行的状态,在调试多线程时必不可少,而且可以点进一个线程查看这个线程的详细运行情况...在ApachePoi 官方提供了对操作大数据量的导入导出的工具和解决办法,操作Excel2007使用XSSF对象,可以分为三种模式: 用户模式:用户模式有许多封装好的方法操作简单,但创建太多的对象,非常耗内存

    77310

    【技术浅析】不同厂商Java虚拟机特性解析

    整理收集器(Mark and Compact Collector) Sun 公司的JVM使用频率还是蛮高的,其主要特点无非就是以下几点: 1、 GC机制...2、 自身的缺陷问题 关于GC,SUN公司JVM GC主要由2部分组成,其一是“频繁”GC,其二是“Full”GC。...2、 通过查看日志,例如: 关于频繁的GC日志信息如下: 10.719: [GC 46136K->17722K(517056K), 0.3663676 secs] 关于FULL GC的日志信息如下:...2、 使用BEA 的JVM启动速度较快 3、 参数设置较为简单 相对其他JVM来说,其性能最强,基于此基础上对线程和网络都做了大量的优化和技巧的工作。...=true — export IBM_JAVADUMP_OUTOFMEMORY=true — export IBM_JAVACORE_OUTOFMEMORY=true — export IBM_HEAPDUMPDIR

    64050

    记一次使用easyexcel导入excel导致cpu跑满的问题

    :56) at org.apache.poi.xssf.usermodel.helpers.ColumnHelper....(ColumnHelper.java:43) at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:144) at...org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:130) at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead...拉取了gc日志发现jvm在频繁的ygc,平均几秒就发生一次.并且在分析问题的这段时间,cpu仍然没有下降,占用cpu高的线程仍然在持续,会不会是这几个线程在创建大量对象,导致ygc频繁回收,而且回收的年轻代空间仍然不满足线程的需要...用户有封装好的方法,使用简单,但是会创建非常多的对象,耗内存,后者用来读取excel,但不用把整个excel加载到内存,减少了至少10倍的内存使用 最终的疑惑也解决了,项目中使用的方式都是用户模式,这才导致了大量内存的消耗

    15310

    JVM面试题

    1、你知道哪些或者你们线上使⽤什么GC策略?它有什么优势,适⽤于什么场景? 参考 触发JVM进行Full GC的情况及应对策略。...-Xmx 设置堆的最大空间大小 -Xms 设置堆的最小空间大小 5、Perm Space中保存什么数据?会引起OutOfMemory吗? 加载class文件。...新生代一般采用复制算法 GC,老年代使用标记整理算法。 垃圾收集器:串行新生代收集器、串行老生代收集器、并行新生代收集器、并行老年代收集器。...http://www.cnblogs.com/dolphin0520/p/3783345.htmll/ 7、你有没有遇到过OutOfMemory问题?你是怎么来处理这个问题的?...常见的原因 内存加载的数据量太大:一次性从数据库取太多数据; 集合类中有对对象的引用,使用后未清空,GC不能进行回收; 代码中存在循环产生过多的重复对象; 启动参数堆内存值小。

    79540

    C# 温故而知新:Stream篇(五)上

    {0}M容量的内存,该内存流最大容量为{1}M,溢出时容量为{2}M", GC.GetTotalMemory(false) / (1024 *...,大家在做项目按照需求自己定制即可,最关键 的还是要取到性能和开销的最佳点位 还有一种更恶心的溢出方式,往往会让大家抓狂,就是不定时溢出,就是MemoryStream处理的文件可能只有...40M或更小时也会发生OutOfMemory 的异常,关于这个问题,终于在老外的一篇文章中得到了解释,运气不错,陈彦铭大哥在他的博客中正好翻译了下,免去我翻译的工作^^,由于这个牵涉到 windows的内存机制...数组,这个构造很重要,初学者或者用的不是很多的程序员会忽略这个构造导致后面读取或写入数据时发现memoryStream中 没有byte数据,会导致很郁闷的感觉,大家注意下就行,有时也可能无需这样,因为很多方法返回值已经是...我在本文探讨关于OutOfMemory异常中也提到了,如果你想额外提高MemoryStream的吞吐量(字节),也只能靠这个方法提升 一定的吞吐量,最多也只能到int.Max,这个方法也是解决OutOfMemory

    1.3K50

    JVM面试题

    作者 : 老码农 网址:lingsui.github.io 1、你知道哪些或者你们线上使用什么GC策略?它有什么优势,适用于什么场景? 参考 触发JVM进行Full GC的情况及应对策略。...-Xmx 设置堆的最大空间大小 -Xms 设置堆的最小空间大小 5、Perm Space中保存什么数据?会引起OutOfMemory吗? 加载class文件。...新生代一般采用复制算法 GC,老年代使用标记整理算法。 垃圾收集器:串行新生代收集器、串行老生代收集器、并行新生代收集器、并行老年代收集器。...链接:http://www.cnblogs.com/dolphin0520/p/3783345.htmll/ 7、你有没有遇到过OutOfMemory问题?你是怎么来处理这个问题的?...常见的原因 内存加载的数据量太大:一次性从数据库取太多数据; 集合类中有对对象的引用,使用后未清空,GC不能进行回收; 代码中存在循环产生过多的重复对象; 启动参数堆内存值小。

    50620
    领券