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

标签 java timer task long-integer

我有一个 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可以被垃圾回收的场景只有两种:

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

  2. 包含 t 声明的类已变得不可访问并已被卸载。

到目前为止,第一种情况最有可能发生,并且有一种简单的方法可以避免这种情况。将声明更改为:

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

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

关于Java 长时间运行的计时器正在被 GC 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33959472/

相关文章:

Java:从HTML中提取所有资源链接

java - SQLite 文件在创建表后不更新

C# 程序占用太多 CPU?

java - 在 Wicket 应用程序中同时运行计时器

javascript - Gulp-rename 更改文件夹中每个文件的名称

java - StringBuffer : is it O(1)? 上 insert(0, c) 操作的复杂度

java - Linux下Swing框架切换时白屏

java - 创建倒计时器 - Java

task - 将本地任务移动到 Mylyn 中的 Mantis 存储库

c# - 以下代码如何自动线程安全?