0

我写了这个测试程序。

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");
        }


    }
}



在此处输入图像描述
即使在我写这个问题的时候,我也看到堆内存使用率不断上升,对程序没有做任何事情。
此外,每次我单击执行 GC 按钮时,Windows 任务管理器都会显示该程序正在使用更多内存。
代码有问题吗?还是这是正常行为?



编辑
后来我发现内存堆使用图在较长的时间范围内有规律地波动。
我不知道为什么会这样,但我想这是另一回事。
如果我可以再问一件事,我发现 Java Monitor 中的堆使用量与 Windows 任务管理器中显示的内存使用量之间存在巨大差异。
Java Monitor 中的堆使用量显示 Eclipse 进程大约有 300MB。
在 Windows 任务管理器中,900MB - ish。
这种差异是因为堆使用量不包括堆栈内存使用量吗?

4

2 回答 2

1

您所说的内存量可以忽略不计。JVM 不会费心处理少量的释放。如果您想查看更有趣的行为,请在请求垃圾回收之前分配并删除对大块的引用。

于 2013-08-28T01:25:55.970 回答
1

即使在我写这个问题的时候,我也看到堆内存使用率不断上升,对程序没有做任何事情。

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

此外,每次我单击执行 GC 按钮时,Windows 任务管理器都会显示该程序正在使用更多内存。

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

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

代码有问题吗?还是这是正常行为?

这是正常行为。

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

于 2013-08-28T04:09:53.343 回答