1

我目前正在运行以下代码,这表明我的 java 应用程序正在使用近 5mb 的内存。但是我的 mac 的活动监视器说它使用 185 mb。额外的内存在哪里使用?即使我的应用程序处于空闲状态,我消耗的内存也在不断增加,从 5 mb 上升到 7 mb。

还有任何java类可以让我观察堆上的最新对象(所有对象分别)以及运行时的内存消耗吗?

  package profiling;

    public class MemConsumption {


        public static void profiling() {
            Runtime runtime = Runtime.getRuntime();
            long memory = runtime.totalMemory() - runtime.freeMemory();
            System.out.println("Used memory is bytes: " + memory);
            System.out.println("Used memory is megabytes: "
                    + bytesToMegabytes(memory));

        }

        public static long bytesToMegabytes(long bytes) {
                final long MEGABYTE = 1024L * 1024L;//1024 kb of 1024 bytes

            return bytes / MEGABYTE;
        }

    }
4

1 回答 1

4

我目前正在运行以下代码,这表明我的 java 应用程序正在使用近 5mb 的内存。

这是分配的 hep 数量,对象实际使用的数量可能会更小。

如果你想要更准确的会计,你可以使用-XX:-UseTLAB,你会看到字节使用了多少。注意:多线程应用程序的速度要慢得多,但要准确得多。

但是我的 mac 的活动监视器说它使用 185 mb。额外的内存在哪里使用?

很可能它会向您显示您正在使用多少虚拟内存,其中包括最大堆大小(堆的地址空间在启动时保留)和共享库、线程堆栈、perm gen、直接内存、内存映射文件,例如 ByteBuffer 等.

注意:虚拟内存不代表分配的内存量,并且是进程独有的。

即使我的应用程序处于空闲状态,我消耗的内存也在不断增加,从 5 mb 上升到 7 mb。

如果您没有真正做任何事情,您是如何确定堆大小的?监控应用程序使用一些堆。

还有任何java类可以让我观察堆上的最新对象(所有对象分别)以及运行时的内存消耗吗?

您需要转储堆并在 VisualVM 或商业分析器中查看它。

BTW MB = 兆字节,Mb = 兆位,mb = 毫位

于 2013-08-16T07:24:16.090 回答