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);
}
}