GC正在使用Java长时间运行的计时器

时间:2015-11-27 14:26:18

标签: java timer task long-integer

我有一个java.util.Timer,我正在安排在凌晨3:00:00每24小时运行一次的TimerTasks,但是在5-8天之后,GC消耗了Timer并且我的所有任务都因为计时器而被取消实例不再存在。

我该如何防止这种情况?

我用:

t.schedule(timerTask, date);

然后任务再次启动(执行任务时也是调用此任务的调用方法)

计时器的定义如下:

public static Timer t = new java.util.Timer();

2 个答案:

答案 0 :(得分:6)

如果声明和创建Timer如下:

    public static Timer t = new java.util.Timer();

然后我认为只有两种情况可以对Timer进行垃圾回收:

  1. 在您的应用程序的某个位置,有些东西会为t分配一个新值,导致之前的值无法访问。

  2. 包含t声明的类已无法访问且已卸载。

  3. 第一种情况是最有可能的,并且有一种简单的方法可以避免它。将声明更改为:

       public static final Timer t = new java.util.Timer();
    

    如果您的应用程序(或者它正在使用的框架)使用本身无法访问的类加载器动态加载类,则第二种情况是合理的。

答案 1 :(得分:1)

static变量是定义它们的class的一部分,并在加载类时初始化。 GC可以在某个时刻决定(特别是当内存不足并且挂起操作需要更多时)卸载不再需要的类。这可能是你在这里发生的事情。您可以尝试将Timer对象创建为类的非静态成员,该类保证具有仍由GC引用的实例。