Java定时器内存泄漏

Java定时器内存泄漏,java,memory-leaks,Java,Memory Leaks,我正在经历我认为是内存泄漏的情况,但我无法真正解释它 我有一个班,可以在里面开始一项任务 public class TestSingleton { void start(){ var task = new ScheduledTask(); task.run(); } static void setNextRequest(Date date){ var task = new ScheduledTask(); if(date !=

我正在经历我认为是内存泄漏的情况,但我无法真正解释它

我有一个班,可以在里面开始一项任务

public class TestSingleton {

   void start(){
      var task = new ScheduledTask();
      task.run();
   }

   static void setNextRequest(Date date){
      var task = new ScheduledTask();
      if(date != null){
         var timer = new Timer();
         timer.schedule(task, date);
      }else{
         task.run();
      }

   }


}
public类ScheduledTSLUpdate扩展TimerTask{
@凌驾
公开募捐{
字符串请求=”http://localhost:2374";
HttpClient-HttpClient=HttpClient.newBuilder()
.version(HttpClient.version.HTTP_2)
.build();
HttpRequest HttpRequest=HttpRequest.newBuilder()
.GET()
.uri(uri.create(请求))
.标题(
“授权”,
“载体”+Configuration.config.getProperty(“JWTTOKEN”))
.build();
HttpResponse response=httpClient.send(httpRequest,HttpResponse.BodyHandlers.ofByteArray());
ResponseEntity ResponseEntity=new Gson().fromJson(response,ResponseEntity.class);
TestClass.setNextRequest(responseEntity.date);
}
}
显然,当我调用start()时,会出现内存泄漏,最终会出现OutOfMemoryError:Java堆空间。理论上,计时器和ScheduledTask对象应该在执行后进行垃圾收集(?)

请帮帮我,我在这里真是不知所措

编辑:

显示异常的屏幕截图(我使用GSON进行反序列化)


每次运行任务时,它都会递归生成一个新任务,因此显然,在内存耗尽之前,它不会停止


如果您想重复一项任务,请参见

好的,谢谢,但是我的问题是,我不能以固定的速率运行任务,因为任务的结果决定下一个任务何时运行。嗯,好的,需要更多考虑。但是您仍然需要删除递归。
schedule
将在将来运行该任务,
Timer
将忘记它。在这个模型中,应该只安排或运行一个任务。为什么你认为这会导致OOM?请发布一个完整的堆栈跟踪。您的代码与您发布的代码不匹配。从堆栈跟踪中,您的
setNextRequest
正在调用
run
,但您的示例中没有显示这一点。再一次,请提供一个。好吧,好吧……你现在看到递归了吗?是的:)我太专注于计时器问题,以至于完全忽略了那个明显的错误。非常感谢,善良的陌生人
public class ScheduledTSLUpdate extends TimerTask {

   @Override
   public void run(){
      String request = "http://localhost:2374";

      HttpClient httpClient = HttpClient.newBuilder()
                .version(HttpClient.Version.HTTP_2)
                .build();

      HttpRequest httpRequest = HttpRequest.newBuilder()
             .GET()
             .uri(URI.create(request))
             .headers(
                  "Authorization",
                  "Bearer " + Configuration.config.getProperty("JWTTOKEN"))
             .build();
      HttpResponse<String> response = httpClient.send(httpRequest,   HttpResponse.BodyHandlers.ofByteArray());

      ResponseEntity responseEntity = new Gson().fromJson(response, ResponseEntity.class);


      TestClass.setNextRequest(responseEntity.date);
   }

}