5

我有这个基本程序,它什么都不做,只是坐在那里等待输入:

import java.io.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Basic {
    public static void main(String[] args) throws Exception{
        try{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String input;
            input=br.readLine();
        }catch(IOException io){
            io.printStackTrace();
        }
    }
}

当我运行这个时:

java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15001 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false Basic

我通过 JConsole 连接以查看:

代码缓存增加

这仅仅是因为最初正在编译核心 java 字节码吗?当进程没有做任何事情时,代码缓存如何增加?

当我有这个版本(它使用Thread.sleep)时:

public class Basic {
    public static void main(String[] args) throws Exception{
        while(true) {
            Thread.sleep(5000);
        }
    }
}

我明白了:

代码缓存增加

那么……为什么会这样?

PS这是输出java -version

java version "1.6.0_37"
Java(TM) SE Runtime Environment (build 1.6.0_37-b06)
Java HotSpot(TM) Client VM (build 20.12-b01, mixed mode, sharing)
4

1 回答 1

1

我怀疑是它jconsole本身导致了问题。或者更准确地说,jmxremote 允许jconsole查看 JVM 内部发生的事情。

我的建议:

  • 别担心。看起来它几乎达到了稳定状态。

  • 如果这还不够好,那么让jconsole运行很长时间并观察内存使用增长是否完全停止。

  • 如果这还不够好,那么您可以尝试对其进行分析……尽管在 jmxremote 代码(有或没有源代码)中追踪小的存储泄漏可能具有挑战性。

于 2013-07-03T22:57:56.187 回答