简单的CLI Java程序不断消耗越来越多的内存

时间:2013-08-28 01:21:53

标签: java garbage-collection jvm

我写过这个测试程序。

import java.io.Console;

public class ConsoleTest{

public static void main(String[] args) {
        // TODO Auto-generated method stub

        Console console = System.console();
        System.out.println("ConsoleTest initialising... \n Enter command : ");
        String line = "";

        if(console!=null){
            while ( (line = console.readLine())!= null ){
                System.gc();
                System.out.println("your input : " + line);

                if("exit".equalsIgnoreCase(line)){
                    System.out.println("Bye ~");                    
                    System.exit(0);
                }else{
                    System.out.println("Enter command : ");
                }

            }
        }else{
            System.out.println("No console found");
        }


    }
}



enter image description here
我看到堆内存使用量不断增加,即使在我写这个问题时,也没有对程序做任何事情。
此外,每次我点击Perform GC按钮时,windows taskmanager都会显示程序正在使用更多的内存 代码有问题吗?或者这是正常的行为?



编辑
后来我发现内存堆使用率图表在更长的时间内有规律地波动。
我不知道为什么会这样做但是我认为这是另一回事。
如果我再问一件事,我看到Java监视器中的堆使用与Windows任务管理器中显示的内存使用之间存在巨大差异。
Java Monitor中的堆使用显示Eclipse进程大约300MB。
在Windows任务管理器中,900MB - 是 这是不同的,因为堆使用不包括堆栈内存使用?

2 个答案:

答案 0 :(得分:1)

你所谈论的记忆量可以忽略不计。 JVM并不打算处理少量释放。如果您想要查看更有趣的行为,请在请求垃圾回收之前分配然后删除对大块的引用。

答案 1 :(得分:1)

  

即使在我写这个问题时,我看到堆内存使用量不断增加,对程序没有任何作用。

监控代理很可能会导致内存使用量的这种自发增长。换句话说,您的监控是由引起的

  

此外,每当我点击Perform GC按钮时,windows taskmanager都会显示程序正在使用更多内存。

可能是同一个问题。其他可能性是:

  • 单击GC按钮不会收集所有堆和/或
  • GC没有将回收的内存回馈给操作系统。
  

代码有问题吗?或者这是正常的行为?

这是正常行为。

您的代码唯一的问题是它正在调用System.gc()。在大多数情况下,这是一个坏主意。