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

Wel*_*ite 2 java timer task long-integer

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

我怎么能阻止这个?

我用:

t.schedule(timerTask, date);
Run Code Online (Sandbox Code Playgroud)

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

计时器定义如下:

public static Timer t = new java.util.Timer();
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 6

如果Timer声明并创建如下:

    public static Timer t = new java.util.Timer();
Run Code Online (Sandbox Code Playgroud)

那么我认为只有两种场景Timer可以收集垃圾:

  1. 在应用程序的某处,某些东西正在为其分配一个新值t,导致之前的值无法访问.

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

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

   public static final Timer t = new java.util.Timer();
Run Code Online (Sandbox Code Playgroud)

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