Quartz Scheduler 不断创建导致 OutOfMemoryError 的新对象
Quartz Scheduler keeps creating new objects leading to OutOfMemoryError
我刚刚按照快速入门指南实施了 Quartz:
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
public class Quartz {
public static void startScheduler() throws InterruptedException{
try {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// Grab the Scheduler instance from the Factory
scheduler.start(); // and start it off
JobDetail job = newJob(RepetitiveRun.class)
// define the job and tie it to RepetitiveRun class
.requestRecovery()// ask scheduler to re-execute this job
.withIdentity("job1", "group1")
.build();
Trigger trigger = newTrigger()
// Trigger the job to run now, and then repeat every x seconds
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(2)
// how often should the job repeat (once every x seconds)
.repeatForever())
.build();
scheduler.scheduleJob(job, trigger);
// Tell quartz to schedule the job using our trigger
try {
Thread.sleep(1200000000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // how many seconds the Main should run
scheduler.shutdown();
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
实现 Job 的 RepetitiveRun class 执行查询并写入文件。
问题是heap不断增加,过一会就抛出java.lang.OutOfMemoryError
使用 VisualVM,我发现与 RepetitiveRun class 关联的活动字节数、活动对象数和生成数不断增加,这表明这是内存泄漏的原因。
是否有可能使 Quartz delete/release 所有在执行已完成的作业期间创建的对象?
通常这是垃圾收集器的工作(工作完成后清理)。
当作业完成并且作业中不再有引用时,垃圾收集器应该清理。
我怀疑您将工作泄露到它之外(例如,将 this
传递给存储对您的工作的引用的任何其他对象)。
或者您没有清理必须由您清理的资源(例如数据库连接或文件句柄)。
这会导致内存泄漏,您必须使用探查器追踪内存泄漏并清理所需内容(通过不将对象泄漏到外部或关闭您 open/create 的所有资源)。
我刚刚按照快速入门指南实施了 Quartz:
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
public class Quartz {
public static void startScheduler() throws InterruptedException{
try {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// Grab the Scheduler instance from the Factory
scheduler.start(); // and start it off
JobDetail job = newJob(RepetitiveRun.class)
// define the job and tie it to RepetitiveRun class
.requestRecovery()// ask scheduler to re-execute this job
.withIdentity("job1", "group1")
.build();
Trigger trigger = newTrigger()
// Trigger the job to run now, and then repeat every x seconds
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(2)
// how often should the job repeat (once every x seconds)
.repeatForever())
.build();
scheduler.scheduleJob(job, trigger);
// Tell quartz to schedule the job using our trigger
try {
Thread.sleep(1200000000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // how many seconds the Main should run
scheduler.shutdown();
} catch (SchedulerException se) {
se.printStackTrace();
}
}
}
实现 Job 的 RepetitiveRun class 执行查询并写入文件。
问题是heap不断增加,过一会就抛出java.lang.OutOfMemoryError
使用 VisualVM,我发现与 RepetitiveRun class 关联的活动字节数、活动对象数和生成数不断增加,这表明这是内存泄漏的原因。
是否有可能使 Quartz delete/release 所有在执行已完成的作业期间创建的对象?
通常这是垃圾收集器的工作(工作完成后清理)。
当作业完成并且作业中不再有引用时,垃圾收集器应该清理。
我怀疑您将工作泄露到它之外(例如,将 this
传递给存储对您的工作的引用的任何其他对象)。
或者您没有清理必须由您清理的资源(例如数据库连接或文件句柄)。
这会导致内存泄漏,您必须使用探查器追踪内存泄漏并清理所需内容(通过不将对象泄漏到外部或关闭您 open/create 的所有资源)。