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