quartz多次执行后,Java Excel POI停止
我想在这方面有一些见解 我有一个程序,可以从数据库读写excel文件。它的执行基于使用Quartz api的计时器,并在每周的每个星期二触发。问题是,当我通过安排它每小时执行一次作业来测试它时,程序在编写excel文件的过程中执行了几次之后突然停止。这是我写的excel代码quartz多次执行后,Java Excel POI停止,java,profiling,apache-poi,quartz-scheduler,Java,Profiling,Apache Poi,Quartz Scheduler,我想在这方面有一些见解 我有一个程序,可以从数据库读写excel文件。它的执行基于使用Quartz api的计时器,并在每周的每个星期二触发。问题是,当我通过安排它每小时执行一次作业来测试它时,程序在编写excel文件的过程中执行了几次之后突然停止。这是我写的excel代码 try { FileInputStream file = new FileInputStream(excelFile); POIFSFileSystem myFileSystem = new
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
工作呢
public class ExtractorSchedulerJobUtilTester implements Job {
public void execute(JobExecutionContext context)
throws JobExecutionException {
theProgram program= new theProgram();
program.main();
JobKey jobKey = context.getJobDetail().getKey();
}
}
有没有可能,
谢谢 经过大量的咒骂、祈祷和搜索,我想我已经找到了一个可能的解决办法。我所做的是添加
System.gc()代码>在我的石英作业课结束时。因此,每次程序完成任务时都调用垃圾回收。这只是一个可能的解决方案,而不是一个具体的答案,因为我仍然在消耗大量的堆内存(我相信在我混乱的代码中仍然有一些内存泄漏)。但是,使用System.gc()代码>我的消费量大大减少了。我只是不知道这是怎么发生的。从逻辑上讲,我认为GC只会影响内存分配,而不会影响程序的内存性能。见下图;顶部的图形是有GC的图形,底部的图形是没有GC的图形
正如您所看到的,有GC的堆内存消耗比没有GC的更少。我假设GC的内存使用率仍然相同,但一旦调用了GC,使用的堆空间就会减少。我现在将使用此解决方案,直到出现更好的答案。评测有什么指导吗?你每次都在启动一个新的虚拟机吗?还可以看到这个吗?调度程序是如何执行程序的?使用java
命令行启动一个新的VM,还是只导入程序的java类并运行?尝试使计划程序每5或10分钟运行一次以进行调试。检查此问题()以了解如何转储JVM崩溃日志。@AlexCheng。我只是导入类并将其作为作业运行。使用jdk的jstack工具创建几个线程转储。当程序挂起时,你应该能够确定你的线程在做什么。从你所提到的来看,excel代码看起来不错。我对触发部分持怀疑态度。通过制作自己的小型调度程序来尝试。i、 例如,以石英为例,让一个线程运行任务并休眠2分钟,然后继续并重复大约20次。如果工作正常,那么问题在于石英
public class ExtractorSchedulerJobUtilTester implements Job {
public void execute(JobExecutionContext context)
throws JobExecutionException {
theProgram program= new theProgram();
program.main();
JobKey jobKey = context.getJobDetail().getKey();
}
}