为什么我的Java进程似乎会随着时间消耗更多内存?我是否产生内存泄漏?
我有一个JavaRESTful服务,它每10秒创建一个新的JSON对象,并将其推送到一个URL,供AngularJS使用 问题是我不认为旧的JSON对象在内存中被释放。当我运行任务管理器时,我看到为什么我的Java进程似乎会随着时间消耗更多内存?我是否产生内存泄漏?,java,memory-leaks,Java,Memory Leaks,我有一个JavaRESTful服务,它每10秒创建一个新的JSON对象,并将其推送到一个URL,供AngularJS使用 问题是我不认为旧的JSON对象在内存中被释放。当我运行任务管理器时,我看到java进程的大小大约每10秒增加一次。我不希望它无限期运行时发生这种情况 我怎样才能解决这个问题 下面是课堂: @Path("/") public class MQDepthJson extends TimerTask { public MQDepthJson() { }
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();
}
}
@Path(“/”)
公共类MQDepthJson扩展TimerTask{
公共MQDepthJson(){
}
私有整数计数=0;
私有静态最终整数数组_SIZE=11;
MQDepth[]MQDepth=新MQDepth[数组大小];
字符串[]c={“c1”、“c2”、“c3”、“c4”、“c5”、“c6”、“c7”、“c8”、“c9”、“c10”、“c11”};
定时器;
公共字符串getMQDepthJson(){
Gson Gson=新的Gson();
而(计数<11){
MQDepth mq=新的MQDepth();
int currentDepth=mq.calculateCurrentDepth();
mq.setCurrentDepth(currentDepth,c[count]);
mqdepts[count]=mq;
计数++;
}
计数=0;
返回gson.toJson(mqdepts);
}
@得到
@路径(“/mqDepthJson”)
@生成(“应用程序/json”)
公共字符串runTask(){
while(true){
定时器=新定时器();
schedule(新的MQDepthJson(),10000);
返回getMQDepthJson();
}
}
@凌驾
公开募捐{
getMQDepthJson();
}
}
Java中没有内存泄漏。您需要创建对象,而不是删除它们。当对象超出范围时,将不再有对它的有效引用。在将来的某个时候,垃圾收集器将释放内存
您可能在Java中无意中保留了对象。代码中可能存在这种情况,因为您使用的是数组而不是ArrayList
。在代码中,如果不再需要MQDepth
数组中的MQDepth
,则必须将该数组位置的值设置为null。像这样
mqDepths[3] = null;
强烈建议您使用数组时使用
ArrayList
。垃圾收集器稍后会自动释放未找到引用变量的对象。
如果您想显式地执行垃圾收集,请使用System.gc()这看起来不像是内存泄漏。这听起来很正常,除非您实际上得到了一个
OutOfMemoryError
(即使这样也不一定意味着内存泄漏)。对象将一直保留,直到它们被垃圾回收,这可能需要很长时间。@LuiggiMendoza这只是没有释放内存的问题吗?老实说,我不确定到底发生了什么。如果您正在使用-server
参数执行JVM,那么您应该阅读。@JonK所以这不是问题?