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

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

我怎样才能防止这一点?

我用:

t.schedule(timerTask, date);

然后这些任务自己再次启动(当任务执行时也是再次调度此任务的调用方法)

计时器是这样定义的:

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

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


如果定时器是这样声明和创建的:

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

那么我认为只有两种情况下Timer可以被垃圾收集:

  • 在你的应用程序的某个地方,某些东西正在给t分配一个新的值,导致以前的值无法访问。

  • 包含t声明的类已变得无法访问并且已被卸载。

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

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

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

    链接地址: http://www.djcxy.com/p/74913.html

    上一篇: Java long running timer is being consumed by GC

    下一篇: How to create a timer task which can be cancelled and rescheduled