我有一个java.util.Timer,我正在安排在凌晨3:00:00每24小时运行一次的TimerTasks,但是在5-8天之后,GC消耗了Timer并且我的所有任务都因为计时器而被取消实例不再存在。
我该如何防止这种情况?
我用:
t.schedule(timerTask, date);
然后任务再次启动(执行任务时也是调用此任务的调用方法)
计时器的定义如下:
public static Timer t = new java.util.Timer();
答案 0 :(得分:6)
如果声明和创建Timer如下:
public static Timer t = new java.util.Timer();
然后我认为只有两种情况可以对Timer
进行垃圾回收:
在您的应用程序的某个位置,有些东西会为t
分配一个新值,导致之前的值无法访问。
包含t
声明的类已无法访问且已卸载。
第一种情况是最有可能的,并且有一种简单的方法可以避免它。将声明更改为:
public static final Timer t = new java.util.Timer();
如果您的应用程序(或者它正在使用的框架)使用本身无法访问的类加载器动态加载类,则第二种情况是合理的。
答案 1 :(得分:1)
static
变量是定义它们的class
的一部分,并在加载类时初始化。 GC可以在某个时刻决定(特别是当内存不足并且挂起操作需要更多时)卸载不再需要的类。这可能是你在这里发生的事情。您可以尝试将Timer
对象创建为类的非静态成员,该类保证具有仍由GC引用的实例。