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

标签 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
即使在我写这个问题时,我也看到堆内存使用量不断上升,对程序没有任何作用。
另外,每次我单击“执行 GC”按钮时,Windows 任务管理器都会显示该程序正在使用更多内存。
代码有问题吗?或者这是正常行为?



编辑
后来我发现内存堆使用图在较长的时间范围内定期波动。
我不知道为什么会这样做,但我认为这是另一回事。
如果我还能问一件事,我发现 Java 监视器中的堆使用情况与 Windows 任务管理器中显示的内存使用情况之间存在巨大差异。
Java Monitor 中的堆使用情况显示 Eclipse 进程的堆使用量约为 300MB。
在 Windows 任务管理器中,900MB - 左右。
这个差异是因为堆使用量不包括堆栈内存使用量吗?

最佳答案

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

关于java - 简单的 CLI Java 程序不断消耗越来越多的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18477947/

相关文章:

java - 当服务器 VM 是默认选项时,为什么有 -server 选项?

java - Spring Boot 和 Zuul 路由

java - 为什么需要指定 Java 堆大小?

具有多个值的枚举中的 java.lang.ExceptionInInitializerError

java - JVM 崩溃时 GC 日志被覆盖

java - "Found 1 deadlock"但跟踪显示未被任何线程锁定

java - JVM - 弱引用是否在次要 GC 中收集?

java - 从表面 View 开始一个新的 Activity

python - 究竟什么时候覆盖的变量会被垃圾回收?

c# - 强制从内存中删除对象