首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用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可见内存引用。...- 如果您将日期和时间存储为字符串,那么可以解析它们并将日期时间存储为整数。 - 如果你基本上需要存储大量字符串,那么继续读下去… 假设我们存储了一亿个字符串。...我们通过这样做放弃是为单个字符串释放内存能力,并且我们增加了一些将字符串体复制到大字节片中开销。 下面是一个演示这个想法小程序。

78450

Android使用注解代替枚举节省系统内存开销方法

Java5以后开始支持枚举类型,枚举类型使用起来非常方便,其重要作用是作为类型安全使用。如果在不考虑系统内存开销情况下大量使用枚举也不会有什么问题。但是移动端还是需要注意。...应用dex code、heap以及运行时内存分配都会在这块内存中。而使用枚举类型dex size是普通常亮13倍以上。在运行时内存分配,一个enum声明至少要消耗掉20个bytes。...从这两点就可以说明,在app中大量使用枚举内存开销是非常大。 枚举最大优势是类型安全。那么是不是又办法在不使用枚举情况下做到类型安全呢?答案是肯定,下面看看怎么干。...goodle官方很早就发现了枚举对android系统带来性能开销,所以在其官网上就已经提醒了开发者尽量少使用枚举,而且还提供了注解方式来检查类型安全。...,从下面可以看到,当使用EnumProxy.getCar输入参数时候,如果直接输入一个整数则编译不通过。

97320
  • 记一次悲惨 Excel 导出事件

    来源:http://t.cn/EGbiLHk 背景 分析过程 看看XSSF和HSSF区别 解决方案 总结 ---- 背景 话说这个背景挺惨,某系统使用了poi-ooxml-3.5-final做excel...起初使用该版本poiHSSF配合多线程生成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

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

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

    1.3K10

    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信息方法

    41840

    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信息方法

    40230

    调优 | Apache Hudi应用调优指南

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

    99820

    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或者

    34720

    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

    52111

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

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

    5.1K32

    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 工具来查看结果日志。

    43830

    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

    26220

    SaaS-百万数据报表概述

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

    76310

    【技术浅析】不同厂商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

    62250

    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不能进行回收; 代码中存在循环产生过多重复对象; 启动参数堆内存值小。

    78540

    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

    Java工程师成神之路(2018版本)

    算法、GC参数、对象存活判定 JVM参数及调优 Java对象模型 oop-klass、对象头 HotSpot 即时编译器、编译优化 类加载机制 classLoader、类加载过程、双亲委派(破坏双亲委派...Full GC、ThreadLocal握手机制 Spring 5 响应式编程 Spring Boot 2.0 3.2 性能优化 使用单例、使用Future模式、使用线程池、选择就绪、减少上下文切换、减少锁粒度...、数据压缩、结果缓存 3.3 线上问题分析 dump获取 线程Dump、内存Dump、gc情况 dump分析 分析死锁、分析内存泄露 自己编写各种outofmemory,stackoverflow程序...HeapOutOfMemory、 Young OutOfMemory、MethodArea OutOfMemory、ConstantPool OutOfMemory、DirectMemory OutOfMemory...、Stack OutOfMemory Stack OverFlow 常见问题解决思路 内存溢出、线程死锁、类加载冲突 使用工具尝试解决以下问题,并写下总结 当一个Java程序响应很慢时如何查找问题、 当一个

    67220

    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不能进行回收; 代码中存在循环产生过多重复对象; 启动参数堆内存值小。

    49920
    领券