使用 poi导大量数据到excel 2007导致内存溢出
我使用的是poi 3.9。导数据到excel 2007。编程环境是eclipse,使用maven进行管理,项目是ssh项目。
主要依赖jar包:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.apache.xmlbeans</groupId> <artifactId>xmlbeans</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>ooxml-schemas</artifactId> <version>1.1</version> </dependency>
我使用循环每次从数据库中取出2000条数据,把这些数据写入到excel中,在写到8万多条的时候,内存溢出了。
我调整了jvm大小。-Xms64m -Xmx500m。
我想请教os上的大神们,有没有什么解决方案?Any help is appreciate
错误信息如下
2013-06-07 16:14:26 DEBUG [com.hzqy.web.limits.user.ac.UserAction] >> 2013-06-07 16:14:26 DEBUG [com.hzqy.web.limits.user.ac.UserAction] >> 2013-06-07 16:14:31 DEBUG [com.hzqy.web.limits.user.ac.UserAction] >> 14 2013-06-07 16:14:31 DEBUG [com.hzqy.web.limits.user.ac.UserAction] >> 18c6d818ae35a3e8279b5330eda01498 2013-06-07 16:14:52 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 报表保存地址:D:sysKandeadmin_musicmaven.1364461128622pom_musicmusic_websrcmainfiledownload订购历史20130607161452.xlsx 2013-06-07 16:14:52 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 工作环境创建成功 2013-06-07 16:14:53 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 基本excel建立成功 2013-06-07 16:15:01 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 2002行 2013-06-07 16:15:01 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:15:08 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 4002行 2013-06-07 16:15:08 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:15:16 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 6002行 2013-06-07 16:15:16 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:15:25 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 8002行 2013-06-07 16:15:25 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:15:35 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 10002行 2013-06-07 16:15:35 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:15:47 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 12002行 2013-06-07 16:15:47 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:15:58 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 14002行 2013-06-07 16:15:58 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:16:11 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 16002行 2013-06-07 16:16:11 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:16:25 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 18002行 2013-06-07 16:16:25 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:16:41 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 20002行 2013-06-07 16:16:41 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:16:56 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 22002行 2013-06-07 16:16:56 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:17:12 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 24002行 2013-06-07 16:17:12 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:17:29 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 26002行 2013-06-07 16:17:29 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:17:47 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 28002行 2013-06-07 16:17:47 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:18:05 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 30002行 2013-06-07 16:18:05 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:18:25 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 32002行 2013-06-07 16:18:25 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:18:44 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 34002行 2013-06-07 16:18:44 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:19:05 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 36002行 2013-06-07 16:19:05 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:19:25 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 38002行 2013-06-07 16:19:25 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:19:47 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 40002行 2013-06-07 16:19:47 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:20:10 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 42002行 2013-06-07 16:20:10 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:20:33 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 44002行 2013-06-07 16:20:33 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:20:57 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 46002行 2013-06-07 16:20:57 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:21:22 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 48002行 2013-06-07 16:21:22 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:21:47 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 50002行 2013-06-07 16:21:47 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:22:25 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 52002行 2013-06-07 16:22:25 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:23:06 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 54002行 2013-06-07 16:23:06 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:23:47 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 56002行 2013-06-07 16:23:47 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:24:33 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 58002行 2013-06-07 16:24:33 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:25:18 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 60002行 2013-06-07 16:25:18 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:26:07 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 62002行 2013-06-07 16:26:07 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:26:57 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 64002行 2013-06-07 16:26:57 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:27:49 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 66002行 2013-06-07 16:27:49 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:28:43 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 68002行 2013-06-07 16:28:43 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:29:45 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 70002行 2013-06-07 16:29:45 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:30:49 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 72002行 2013-06-07 16:30:49 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:31:55 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 74002行 2013-06-07 16:31:55 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:33:07 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 76002行 2013-06-07 16:33:07 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:34:23 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 78002行 2013-06-07 16:34:23 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:35:48 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 80002行 2013-06-07 16:35:48 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:37:23 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 82002行 2013-06-07 16:37:23 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:39:10 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 84002行 2013-06-07 16:39:10 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:41:05 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 86002行 2013-06-07 16:41:05 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:43:16 DEBUG [com.hzqy.web.music.stat.poiutil.POIUtil] >> 报表写入成功,写入数据 88002行 2013-06-07 16:43:16 DEBUG [com.hzqy.web.music.stat.biz.OrderHisBiz] >> 还有数据要处理 2013-06-07 16:43:49.482:WARN::/music_web/downExcelOrderHistoryVo.action java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404) at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229) at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150) at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:123) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:167) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:105) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:83) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:207) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:74) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:127) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:107) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:206) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:115) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:143) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:121) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:170) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:123) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:50) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:507) at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:421) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212) at org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:99) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212) at com.hzqy.web.limits.user.LoginFilter.doFilter(LoginFilter.java:38) at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212) at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399) at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766) at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450) at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) at org.mortbay.jetty.Server.handle(Server.java:326) at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:928) at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549) at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212) at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410) at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582) 2013-06-07 16:43:49.482:WARN::Nested in java.lang.reflect.InvocationTargetException: java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:2271) at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113) at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93) at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140) at org.apache.poi.openxml4j.opc.internal.MemoryPackagePartOutputStream.write(MemoryPackagePartOutputStream.java:88) at org.apache.xmlbeans.impl.store.Cursor._save(Cursor.java:590) at org.apache.xmlbeans.impl.store.Cursor.save(Cursor.java:2544) at org.apache.xmlbeans.impl.values.XmlObjectBase.save(XmlObjectBase.java:212) at org.apache.poi.xssf.usermodel.XSSFSheet.write(XSSFSheet.java:2695) at org.apache.poi.xssf.usermodel.XSSFSheet.commit(XSSFSheet.java:2655) at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:313) at org.apache.poi.POIXMLDocumentPart.onSave(POIXMLDocumentPart.java:317) at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:173) at org.apache.poi.xssf.streaming.SXSSFWorkbook.write(SXSSFWorkbook.java:768) at com.hzqy.web.music.stat.poiutil.POIUtil.writeObjListToExcel(POIUtil.java:187) at com.hzqy.web.music.stat.biz.OrderHisBiz.excute(OrderHisBiz.java:64) at com.hzqy.web.music.stat.ac.FileAction.downExcelOrderHistoryVo(FileAction.java:63) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:404) at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:267) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:229) at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224) at com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223) at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:221) at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:150) at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:48)
我写excel的工具类:POIUtil
刚开始的时候,我执行到6万条记录就内存溢出了,我电脑内存完全被占用了。后来通过查资料,使用SXSSFWorkbook 这个类来写excel,并且在内存中记录满100条的时候就往硬盘上输出。这样我电脑内存一直有空余。代码出错在187行,workbook.write(os);这一段。我的数据量并没有达到Integer的最大值。我感觉是在写excel的过程中,有大量的对象被创建,而没有被gc及时清理,而导致内存不足。
package com.hzqy.web.music.stat.poiutil; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import com.hzqy.web.music.stat.refutil.GetValueByRef; /** * poi实现excel的生成 * * @author sd * */ public class POIUtil { private static final Log LOG = LogFactory.getLog(POIUtil.class); public static int start_index = 0;// 写入序号 public static int start_row = 0;// 从第几列开始写 public static final int RAM_MAX_SIZE = 100;//内存中记录缓存数量 public static final int BUFF_SIZE = 1024;//字节缓冲数量 //TODO 建立样式 public void getStyle(){ } /** * 初始化excel * * @param fileName * excel名称(XXX.xls或者XXX.xlsx) * @param sheetIndex * 第几个sheet * @param title * 报表标题 * @param colName * 报表列明 * @param widthArr * 报表宽度 */ public static void initExcel(String fileName, int sheetIndex, String title, String[] colName, int[] widthArr) { if (null == fileName || fileName.equals("")) { LOG.error("请传入文件名 "); return; } start_index = 0;// 设置为初始值。不然static的index会一直递增 start_row = 0; int init = 0; SXSSFWorkbook workbook = null; OutputStream os = null; try { workbook = new SXSSFWorkbook(RAM_MAX_SIZE);//内存中保留 10000 条数据,以免内存溢出,其余写入 硬盘 CellStyle style = workbook.createCellStyle(); style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 垂直居中 style.setAlignment(XSSFCellStyle.ALIGN_CENTER);// 水平居中 Font font = workbook.createFont(); font.setFontHeightInPoints((short) 16);//字体大小 // 把字体应用到当前的样式 style.setFont(font); LOG.debug("工作环境创建成功"); Sheet sheet = workbook.createSheet("sheet" + sheetIndex);// 获得要操作的单个sheet Row hssrow = sheet.createRow(0);// 创建一行,作为标题 if (null != title && !title.equals("")) { sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, colName.length - 1));// 合并单元格 Cell cell = hssrow.createCell(0);// 创建一个单元格 cell.setCellStyle(style);// 设置样式 cell.setCellValue(title);// 写入标题 init++; } int col = 0;// 从第几列开始写 //设置单元格宽度 Row tr_row = sheet.createRow(init); if(colName != null){ for (col = 0; col < colName.length; col++) { sheet.setColumnWidth(col, widthArr[col] * 256);// 以256像素为一单位 Cell cell = tr_row.createCell(col);// 创建一个单元格 cell.setCellValue(colName[col]);// 写入标题 } init++; } start_row = init; os = new FileOutputStream(fileName,true); workbook.write(os); LOG.debug("基本excel建立成功"); } catch (FileNotFoundException e) { LOG.error("找不到指定文件:" + fileName); e.printStackTrace(); } catch (IOException e) { LOG.debug("io 异常"); e.printStackTrace(); } finally { if (null != os) { try { os.close(); } catch (IOException e) { LOG.error("输出流关闭失败"); e.printStackTrace(); } } } } /** * 将voList 写入 excel * * @param sheetIndex * 第几个表单 * @param objList * 要插入的数据 * @param fileName * 操作的excel表 * @param fieldArr * bean 字段 */ public static <T> void writeObjListToExcel(int sheetIndex,final List<T> objList, String fileName, String[] fieldArr) { if (objList != null && objList.size() > 0) { SXSSFWorkbook workbook = null; FileInputStream in = null; OutputStream os = null; XSSFWorkbook xssbook = null; try { /** * 读取原来写入的文件 */ in = new FileInputStream(fileName); xssbook = new XSSFWorkbook(in); workbook = new SXSSFWorkbook(xssbook,RAM_MAX_SIZE);// 通过已存在的excel获取workbook SXSSFSheet sheet = (SXSSFSheet) workbook.getSheetAt(sheetIndex);// 获取指定的sheet /** * 写入数据 */ for (Object tmp : objList) { int col = 0; start_index++; Row hssrow = sheet.createRow(start_row); Cell cellindex = hssrow.createCell(0);// cellindex用来写序号 cellindex.setCellValue(start_index);// 第一列用来写序号 col++; /** * 通过反射取值,并且写入到excel中 */ for (int i = 0; i < fieldArr.length; i++) { String fieldName = fieldArr[i]; Object value = GetValueByRef.getValueByRef(tmp, fieldName); String str = null; if (value == null) { str = ""; } else { str = String.valueOf(value); } Cell cellvalue = hssrow.createCell(col);// cellvalue用来写字段对应的值 cellvalue.setCellValue(str); col++; } start_row++; if(start_row % RAM_MAX_SIZE ==0){//数据到达内存最缓存最大值,写入到zip中 sheet.flushRows();//全部写入到硬盘 } } // sheet.flushRows(); os = new FileOutputStream(fileName); // System.out.println(os.); workbook.write(os); LOG.debug("报表写入成功,写入数据 "+start_row+"行"); } catch (IOException e) { LOG.debug("io 异常"); } finally { if (in != null) { try { in.close(); } catch (IOException e) { LOG.debug(" 读取文件流异常"); e.printStackTrace(); } } if (os != null) { try { os.close(); } catch (IOException e) { LOG.error("关闭文件流异常"); e.printStackTrace(); } } } } } }poiutil用到的工具类:GetValueByRef
package com.hzqy.web.music.stat.refutil; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import com.hzqy.web.commons.vo.AreaVo; public class GetValueByRef { /** * 用反射获取 字段的值 * @param srcObj 作用对象 * @param fieldName 字段名称 * @return */ public static Object getValueByRef(Object srcObj, String fieldName){ Object value = null; Class objClass = srcObj.getClass(); fieldName =fieldName.replaceFirst(fieldName.substring(0, 1), fieldName.substring(0, 1).toUpperCase()); String getMethodName = "get"+fieldName; try { Method method = objClass.getMethod(getMethodName);//第一个参数为调用的方法名。第二个为方法的返回值:类型 value = method.invoke(srcObj);///第一个参数表示要调用的对象,后者为传给这个方法的参数 } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); }catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } return value; } }
这个问题困扰了我很久,希望os上的朋友们给我一些实现上的思路
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
方案1:改代码,直接写xml文件。
方案2:用商业软件。
内存中最大记录数量我设置了100。 硬盘压缩数据的话,我也尝试了。对Java内存没有多大影响。记录跑到 8万多条的时候还是溢出了。
回复
分sheet页导入,每页放个3W条试试。我试过导出十几万条没问题的
可能是我数据字段有点多,所以生成的XML文档比较大。 我最多只能导8万多条,jvm就溢出了。 我现在改写了代码,分多个sheet,每个sheet写2万条。内存没有溢出,导出速度也快多了。
回复
:)
1、
2、分sheet页导入,每个sheet页面导入指定数量
这样的写法我也尝试过,但是代码没有调式成功。可能是因为我用的是jar包和他不同。
http://www.cnblogs.com/jambol/archive/2008/09/11/1288889.html 这个看看有没有用
他们需求是这么提的,如果确实无法解决这个问题,我再考虑导其他格式的。txt是最快的,csv效率也不错,html格式和excel最接近也可以考虑一下。
@moyiguke 要不你分次导出,8W条数据分3次添加到Excel文件里面。。
不要输出Excel格式,直接输出生CSV吧~~
一般都能接受的~~