Java Excel POI 在quartz 多次执行后停止

2023-11-27

我想对此有一些见解。

我有一个从数据库读取和写入 Excel 文件的程序。它的执行基于使用 Quartz api 的计时器,并在每周的每个星期二触发。问题是,当我通过安排它每小时执行一次作业来测试它时,程序在写入 Excel 文件的过程中执行几次后突然停止。这是我写入Excel的代码。

try {
        FileInputStream file = new FileInputStream(excelFile);
        POIFSFileSystem myFileSystem = new POIFSFileSystem(file);
        HSSFWorkbook workbook = new HSSFWorkbook(myFileSystem);
        HSSFSheet worksheet = workbook.getSheetAt(0);
        this.cellStyle00 = workbook.createCellStyle();
        HSSFDataFormat df = workbook.createDataFormat();
        this.cellStyle00.setDataFormat(df.getFormat("00"));

for(int i = 0;i<Access.size();i++){
         AccessorMethods SetGet = (AccessorMethods)
                    InstlibAccessor.get(i);

    HSSFRow row = worksheet.createRow(worksheet.getPhysicalNumberOfRows());
    HSSFCell cell = row.createCell(0);

    cell.setCellValue(new Double(SetGet.getOne()));
    cell.setCellStyle(cellStyle00);


  //other set value codes....

}
FileOutputStream fileOut = new FileOutputStream(fileName + ".xls");
workbook.write(fileOut);
 fileOut.flush();
 fileOut.close(); 

 //catch statements follow
 //end

命令行输出和netbeans输出不指示任何错误,例如内存不足等。程序不会结束..它只是停止..就像jvm正在无限循环上工作一样...为了提供更多信息关于这个主题,这是我的程序的简要流程。

  1. 用户执行调度程序
  2. 在所需的时间,调度程序执行程序(调度程序和“程序”是两个不同的程序/jar 文件。调度程序只是调用 jar)
  3. 程序首先创建 Excel 文件
  4. 然后读取数据库1。该数据库包含80K行
  5. 对于每一行,如果满足某个条件,则读取数据库 2 和 3
  6. 然后它将它一次存储在一个 arraylist 对象中(我试图避免任何内存问题,所以我批量存储它)
  7. 然后我分批编写,一次 1000 个以求出色(这是它停止的部分)
  8. 完成读写后,它会等待调度程序再次调用它...如果到达这一步,我就是一个快乐的程序员 =)

以下是我发现的一些观察结果;

  1. 程序通常在程序第 4 到 6 次执行时停止(即在调度程序不间断运行 4 或 6 小时后)
  2. 它停止在 Excel 中的随机写入点,例如第 34000 行、第 24 行或第 15 行等等等......
  3. 当我在没有调度程序的情况下执行程序时,不会发生此错误。我可以手动执行一整天(我做到了,这不是很有趣),没有任何错误。
  4. 输出 Excel 文件的大小显示为 0 字节
  5. 例如,如果我安排它每小时运行一次,但在这一小时它停止了。它仍将在接下来的几个小时内运行,但会停止,并且与前一次运行相比会在不同的点停止。

可能是什么原因导致了这个问题。也许是内存泄漏或更简单的原因?

附加信息

我通过导入其他程序的类并将其作为作业运行来实现 Quartz 调度程序。这是触发器的代码

JobDetail job = newJob(ExtractorSchedulerJobUtilTester.class)
            .withIdentity("job1", "group1")
            .build();

    CronTrigger trigger = newTrigger()
            .withIdentity("trigger1", "group1")
            .withSchedule(cronSchedule("0 0/2 * 1/1 * ? *"))
            .build();

    Date ft = sched.scheduleJob(job, trigger);
        sched.start();

和工作

public class ExtractorSchedulerJobUtilTester implements Job {
    public void execute(JobExecutionContext context)
        throws JobExecutionException {
    theProgram program= new theProgram();

    program.main();

    JobKey jobKey = context.getJobDetail().getKey();
    }
}

有没有可能;

  1. 该应用程序耗尽了我的内存并崩溃了
  2. 我在 Quartz 作业中仅使用“程序”的一个实例,该实例在作业第一次运行时初始化,并且该作业的所有后续执行都从该实例引用,从而最大化了内存。
  3. 它与数据库(AS400)相关(我怀疑,因为它在写入 Excel 时停止)。
  4. 计算机变得太累了,决定休息一下。

更新 - 12/28/2012

新年快乐伙计们/姑娘们!!

抱歉,我花了一些时间才回到这个话题..(当世界将在 21 号结束时,为什么还要在这上面浪费时间呢?当世界没有结束时,我感到苦乐参半)

我使用 netbeans profiler 分析了我的程序,并使用内存分析器得到了以下数据

memory dump

我在第一张图中注意到,我的程序每次迭代都会消耗大约 75MB 的堆大小(如粉色阴影所示)。这是否意味着程序每次迭代消耗的内存增加了 75mb?经过几次迭代后,将消耗大量内存,从而影响程序的执行。我目前正在尝试进行堆转储。一旦我设法让它运行,我就会立即发布它。

附加信息:我尝试使用仅运行 Quartz 的探查器(不触发任何内容),系统使用率相对较低,并且每次迭代的大小不会增加。

我终于设法得到了堆转储。我进行了两次转储,第一次是第一次迭代发生时,第二次是下一次迭代时。我注意到我的两个类的实例之间存在很大差异,如下所示

hash dump

Thanks!


经过大量的咒骂、祈祷和寻找之后,我想我已经找到了一个可能的解决方案。我所做的是添加System.gc();在我的 Quartz 工作课程结束时。因此,每次程序完成作业时都会调用垃圾收集。这只是一个可能的解决方案,而不是一个具体的答案,因为我仍然消耗了大量的堆内存(我相信在我的代码的混乱中仍然存在一些内存泄漏)。但是,随着System.gc();我的消费量大大减少了。我只是不确定这是怎么发生的。从逻辑上我认为GC只会影响内存分配而不影响程序的内存性能。见下图;上图是有 GC 的图,下图是没有 GC 的图。

enter image description here

正如您所看到的,使用 GC 的内存消耗比不使用 GC 的内存要少。我假设内存使用量仍然与 GC 相同,但是一旦调用 GC,使用的堆空间就会下降。我现在将使用这个解决方案,直到出现更好的答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Excel POI 在quartz 多次执行后停止 的相关文章

  • 如何将变量的全部内容发送/导出到文本文件/xml 文件/剪贴板?

    我想将实例的内容 最好以树形形式 发送给某人 打印屏幕是不行的 因为类太复杂了 您需要将输出转回实例吗 在这种情况下 其他答案都是正确的 如果您只想手动检查实例的内容 理想情况下您的类都将实现toString 你可以将其重定向到一个文件 如
  • ScheduledThreadPoolExecutor如何在特定时间运行任务?

    特别是 它是否像这样在内部实现了 while true 循环 while System currentTimeMillis lt timeToRunTask Thread sleep 1000 doTask From http grepco
  • 如何提取文件 jre-9/lib/modules?

    In JRE 9 lib目录 至少在 Windows 上 有一个名为modules其大小约为107 MB 是否可以提取该文件或在其中列出 java 模块 我可以看到一个名为jmod可以在jdk 9 bin jmod exe 但那是为了阅读
  • 如何配置 Spring-WS 以使用 JAXB Marshaller?

    感谢您到目前为止对此的帮助 我正在更新问题 因为我没有显示我需要的所有内容 并显示了建议的更改 肥皂输出仍然不是我想要的 servlet xml
  • 在命令行java中突出显示文本[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一项任务是重新创建 unix cal 程序 除了一部分之外 相当简单 今天 它突出显示了该数字 我不知道该怎么做 关于如何在 Ja
  • 如何在Java中优雅地处理SIGKILL信号

    当程序收到终止信号时如何处理清理 例如 我连接到一个应用程序 希望任何第三方应用程序 我的应用程序 发送finish注销时的命令 发送该信息最好说什么finish当我的应用程序被破坏时的命令kill 9 编辑1 kill 9无法被捕获 谢谢
  • 具有 CRUD 功能的基于 Spring Web 的管理工具

    在 PHP Symfony 世界里有一个工具叫 Sonata Adminhttps sonata project org https sonata project org 基于 AdminLTE 模板 这是一款一体化管理工具 具有登录 菜单
  • Android WebView文件上传

    我正在开发一个 Android 应用程序 基本上它是一个WebView和一个进度条 Facebook 的移动网站 m facebook com 已加载到WebView 当我单击 选择文件 按钮上传图像时 没有任何反应 我已经尝试了所有的解决
  • 使用 JAX-WS 的 WebLogic 中没有模式导入的单个 WSDL

    如何使用 JAX WS 配置由 WebLogic 10 3 6 生成的 Web 服务 以将对象架构包含在单个 WSDL 文件声明 而不是导入声明 中 示例代码 界面 import javax ejb Local Local public i
  • 正则表达式在 Velocity 模板中不起作用

    我在 Test java 中尝试过这个 String regex lt s br s s gt String test1 lt br gt System out println test replaceAll regex 但是当我在速度模板
  • 查找数组中的组合

    我在java中有一个像这样的二维数组 transmission communication tv television approach memorycode methodact 我需要获得所有组合 例如 transmission appr
  • 使用 HTTPServletRequestWrapper 包装请求参数

    我有一个可以验证 授权 REST 调用的过滤器 该过滤器需要访问请求参数 因此我为此编写了一个自定义 HTTPServletRequestWrapper import java util Collections import java ut
  • Java和手动执行finalize

    如果我打电话finalize 在我的程序代码中的一个对象上 JVM当垃圾收集器处理这个对象时仍然再次运行该方法吗 这是一个大概的例子 MyObject m new MyObject m finalize m null System gc 是
  • Android项目中使用java获取电脑的IP地址

    我在用ksoap2 android http code google com p ksoap2 android 我需要使用java获取IP地址 这样我就不必每次都手动输入它 我所说的 IP 地址是指 例如 如果我这样做ipconfig使用命
  • Java:一个函数有多种返回类型...可以使用泛型吗?

    为了简单起见 我有一些程序 如下所示 public String fetchValueAsString String key public DateTime fetchValueAsDateTime String key 我想要类似的东西
  • Java String ReplaceAll 方法给出非法重复错误?

    我有一个字符串 当我尝试运行时replaceAll方法 我收到这个奇怪的错误 String str something op str str replaceAll o n it works fine str str replaceAll n
  • 如何使用注释处理 Hibernate 和 Spring 中的连接查询?

    我正在使用 Spring 和 Hibernate 以及 MySQL 开发应用程序 我是 Hibernate 新手 完成了基本任务 现在我需要在选择查询中应用联接以使用注释从多个表中获取数据 我已经搜索过但仍然没有任何想法 这是我的数据库表和
  • 你能快速告诉我这个伪代码是否有意义吗?

    我相信我的代码现在是万无一失的 我现在将写出伪代码 但我确实有一个问题 为什么 DRJava 要求我返回 if 语句之外的内容 正如你所看到的 我为 ex 写了 return 1 只是因为它问了 但是它永远不会返回该值 谁可以给我解释一下这
  • 如何使用 Jest 从 ElasticSearch 获取索引列表

    我正在尝试使用 Jest 检索索引列表 但我只得到 Stats statistics new Stats Builder build result client execute statistics 如何从结果中检索索引列表 除了统计之外
  • 使用 AmazonSNSClient 发送短信时的授权

    aws 官方文档如何发送短信 http docs aws amazon com sns latest dg sms publish to phone html使用 java 中的 aws SDK 非常简单 但是 当发送如底部示例所示的消息时

随机推荐

  • 如何绑定perl脚本中的每个变量?

    我想看到 perl 脚本中的变量被创建 访问 销毁时的每个地方 使用它可以轻松到达tie or Variable Magic 但是如何在创建变量时自动应用这个魔法呢 您可以查看 B Xref 它会生成应用程序中所有变量的交叉引用列表 基本上
  • 导航视图项目按下时不会响应

    我正在开发一个带有侧导航抽屉的应用程序 抽屉打开得很好 但是据说可以 点击 的文本似乎没有响应 动画显示 当轻敲抽屉时会有反馈 您可以听到声音 但没有任何结果 我尝试放置 toast 消息以查看按钮是否注册了操作 但按下时没有出现 toas
  • JPanel 动作监听器

    我有一个 JPanel 其中有一堆不同的复选框和文本字段 我有一个已禁用的按钮 需要在设置特定配置时启用 我需要的是在整个 JPanel 上寻找事件的监听器 每当发生任何变化时 我相信我需要一个动作侦听器 但我找不到任何东西来桥接动作侦听器
  • “导入错误:没有名为 pwd 的模块”,但它存在

    我正在尝试在本地测试 gae boilerplate 但是当我尝试创建新帐户时 会出现以下错误 奇怪的是 如果我打开 python 解释器并输入 import pwd 它就会起作用 Internal Server Error The ser
  • Objective C 中的悬空指针 - nil 也会释放内存吗?

    我的理解是 当内存未被释放或 释放 时 就会发生内存泄漏 当指针未设置为 nil 并且对象被释放时 就会出现悬空指针 我的问题是 可以将对象设置为 nil 释放内存并清除指针引用吗 i e Car myCar Car alloc initW
  • 需要重构箭头反模式的想法

    我继承了一个怪物 它伪装成 NET 1 1 应用程序处理符合医疗保健索赔支付 ANSI 835 标准的文本文件 但它是一个怪物 正在处理的信息涉及医疗保健索赔 EOB 和报销 这些文件由在前几个位置具有标识符的记录和根据该类型记录的规范格式
  • Go结构体和字节数组之间的转换

    我正在用 Go 编写一个客户端 服务器应用程序 我想在 Go 中执行类似 C 的类型转换 例如 在围棋中 type packet struct opcode uint16 data 1024 byte var pkt1 packet n r
  • 如何在视图内切换视图?

    我正在使用 MVVM 轻型框架制作一个 WPF 应用程序 我想做的是在视图中有一个登录表单 当用户按下该视图中的按钮时 它会为附加的 ViewModel 启动 LoginCommand 从那里我要么想要启动一个包含应用程序其余部分的新窗口
  • 没有可用的 mysql-server 软件包

    我正在尝试在 Amazon Linux 实例上设置 MySQL 我已经尝试了所有方法 也使用 y 选项 sudo yum install mysql server sudo yum install mysql56 server sudo y
  • 从类中删除必需的属性,但 MVC3 仍然不会在文本框中没有值的情况下发布表单

    我有课 在某一时刻 我使用 System ComponentModel 将类的属性设置为 Required 好吧 然后我意识到这是没有必要的 我已经删除了所需的属性 但是当我尝试将表单提交到 ActionResult 时 表单不会发布 并且
  • C# - 通过进程名称的一部分来终止进程

    我正在寻找如何在 C 中执行此操作 如下所示 foreach Process proc in Process GetProcessesByName cheatengine x86 64 proc Kill 我正在使用这个语句 但是该程序有不
  • 销毁并重新创建一个对象是否会使指向该对象的所有指针无效?

    这是后续这个问题 假设我有这样的代码 class Class public virtual method this gt Class new this Class Class object new Class object gt metho
  • 检测 Android JNI 代码中的本机内存泄漏

    如何检测Android JNI代码中的内存泄漏 我正在使用弗罗约 2017年更新 valgrind 可用对于安卓 内置的 malloc 调试功能在以下版本中得到了显着扩展 安卓N 对于查找内存泄漏非常有用 您可能需要 exit 应用程序触发
  • iPhone 的动态图标更改

    我的问题也和其他人之前问过的一样 我发现一旦你设置了应用程序的图标 我们就无法更改应用程序图标动态地 是的 我同意了 如果是这样 我们使用动态图标苹果不接受 但我承认苹果有一些规则和规定 所以这是我的问题 如何动态更改应用程序图标 我不会将
  • AppleScript:获取对象或类的所有属性的列表

    为了存储对象的值以供外部 外部 AS 访问 我需要能够获取该对象的每个属性 然后我尝试将其强制为文本并将其存储在某个地方 如何获取对象拥有的属性列表 作为一个例子 我可以这样写 tell me get properties end tell
  • 定义每个子类定义一次的静态属性的最佳方法是什么?

    我编写了以下控制台应用程序来测试静态属性 using System namespace StaticPropertyTest public abstract class BaseClass public static int MyPrope
  • Android 上的 Eclipse 调试出了什么问题? [复制]

    这个问题在这里已经有答案了 可能的重复 Android 看似无用的调试环境 我显然已经被 Visual Studio 宠坏了 因为虽然我刚刚学习 Android 和 Eclipse 环境 但在 Eclipse 中调试应用程序正在严重损害进一
  • 是什么导致我的函数最后返回 None ? [复制]

    这个问题在这里已经有答案了 我非常简单的 python 函数正在返回None最后 我不太清楚为什么 我看了一些其他的帖子 还是没明白 这是我的代码 def printmult n i 1 while i lt 10 print n i en
  • CSS图灵完备了吗?

    据我所知 CSS 不是图灵完备 但我对 CSS 的了解非常有限 CSS图灵完备了吗 你可以编码Rule 110在 CSS3 中 所以只要您考虑适当的随附 HTML 文件 它就是图灵完备的和用户交互成为CSS 执行 的一部分 A相当好的实施可
  • Java Excel POI 在quartz 多次执行后停止

    我想对此有一些见解 我有一个从数据库读取和写入 Excel 文件的程序 它的执行基于使用 Quartz api 的计时器 并在每周的每个星期二触发 问题是 当我通过安排它每小时执行一次作业来测试它时 程序在写入 Excel 文件的过程中执行