我有一个 java.util.Timer,我正在安排每 24 小时在凌晨 3:00:00 运行一次的 TimerTasks,但是在 5-8 天后,GC 消耗了 Timer,我的所有任务都被取消了,因为计时器实例不再存在。
我怎样才能避免这种情况?
我使用:
t.schedule(timerTask, date);
然后任务又开始了(当任务被执行时也调用了再次调度这个任务的方法)
定时器是这样定义的:
public static Timer t = new java.util.Timer();
最佳答案
如果定时器是这样声明和创建的:
public static Timer t = new java.util.Timer();
那么我认为Timer
可以被垃圾回收的场景只有两种:
在您的应用程序的某处,某些东西正在为
t
分配一个新值,导致以前的值变得无法访问。包含
t
声明的类已变得不可访问并已被卸载。
到目前为止,第一种情况最有可能发生,并且有一种简单的方法可以避免这种情况。将声明更改为:
public static final Timer t = new java.util.Timer();
第二种情况只有在您的应用程序(或者可能是它正在使用的框架)使用本身变得无法访问的类加载器动态加载类时才合理。
关于Java 长时间运行的计时器正在被 GC 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33959472/