为什么我的Java进程似乎会随着时间消耗更多内存?我是否产生内存泄漏?

为什么我的Java进程似乎会随着时间消耗更多内存?我是否产生内存泄漏?,java,memory-leaks,Java,Memory Leaks,我有一个JavaRESTful服务,它每10秒创建一个新的JSON对象,并将其推送到一个URL,供AngularJS使用 问题是我不认为旧的JSON对象在内存中被释放。当我运行任务管理器时,我看到java进程的大小大约每10秒增加一次。我不希望它无限期运行时发生这种情况 我怎样才能解决这个问题 下面是课堂: @Path("/") public class MQDepthJson extends TimerTask { public MQDepthJson() { }

我有一个JavaRESTful服务,它每10秒创建一个新的JSON对象,并将其推送到一个URL,供AngularJS使用

问题是我不认为旧的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();       
    }
}
@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所以这不是问题?