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 的所有资源)。