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

时间:2015-10-12 14:22:31

标签: java memory-leaks

我有一个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();       
    }
}

2 个答案:

答案 0 :(得分:0)

Java中没有内存泄漏。你打扰创建对象而不是删除它们。当一个对象超出范围时,没有更多有效的引用。在将来的某个时刻,垃圾收集器将释放内存。

您可能在Java中无意识地保留了对象。您的代码中可能存在这种情况,因为您使用的是数组而不是ArrayList。在您的代码中,如果您不再需要MQDepth数组中的mqDepths,则必须将数组该位置的值设置为null。喜欢这个

mqDepths[3] = null;

强烈建议您使用ArrayList来处理数组。

答案 1 :(得分:0)

垃圾收集器将在以后自动释放未找到其引用变量的对象。 如果要显式进行垃圾回收,请使用System.gc()