我有一个Java RESTful服务,它每10秒创建一个新的JSON对象,并将其推送到AngularJS使用的URL。
问题是我不认为旧的JSON对象在内存中被释放。当我运行任务管理器时,我发现java
进程大约每10秒增加一次。当它无限期地运行时,我不希望这种情况发生。
我该如何解决这个问题?
这是班级:
@Path("/")
public class MQDepthJson extends TimerTask {
public MQDepthJson() {
}
private int count = 0;
private static final int ARRAY_SIZE = 11;
MQDepth[] mqDepths = new MQDepth[ARRAY_SIZE];
String[] c = {"c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "c11"};
Timer timer;
public String getMQDepthJson() {
Gson gson = new Gson();
while(count < 11) {
MQDepth mq = new MQDepth();
int currentDepth = mq.calculateCurrentDepth();
mq.setCurrentDepth(currentDepth, c[count]);
mqDepths[count] = mq;
count++;
}
count = 0;
return gson.toJson(mqDepths);
}
@GET
@Path("/mqDepthJson")
@Produces("application/json")
public String runTask() {
while(true) {
Timer timer = new Timer();
timer.schedule(new MQDepthJson(), 10000);
return getMQDepthJson();
}
}
@Override
public void run() {
getMQDepthJson();
}
}
答案 0 :(得分:0)
Java中没有内存泄漏。你打扰创建对象而不是删除它们。当一个对象超出范围时,没有更多有效的引用。在将来的某个时刻,垃圾收集器将释放内存。
您可能在Java中无意识地保留了对象。您的代码中可能存在这种情况,因为您使用的是数组而不是ArrayList
。在您的代码中,如果您不再需要MQDepth
数组中的mqDepths
,则必须将数组该位置的值设置为null。喜欢这个
mqDepths[3] = null;
强烈建议您使用ArrayList
来处理数组。
答案 1 :(得分:0)
垃圾收集器将在以后自动释放未找到其引用变量的对象。 如果要显式进行垃圾回收,请使用System.gc()