java - 如何获取java中堆上所有对象单独消耗的运行时内存

标签 java memory profiling

我目前正在运行以下代码,这表明我的 java 应用程序使用了将近 5mb 的内存。但是我的 Mac 的 Activity 监视器显示它使用了 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;
        }

    }

最佳答案

I am currently running the following code, which shows that my java application is using nearly 5mb of memory.

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

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

But my mac's activity monitor says its using 185 mb. Where is the extra memory used?

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

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

Also my memory consumed is constantly increasing starting from 5 mb rising to 7 mb in a min even when my app is idle.

如果你什么都不做,你是如何确定堆大小的?监控应用程序使用一些堆。

Also is there any java class which lets me observe the latest objects (all objects separately) on heap and there memory consumption during runtime?

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

顺便说一句,MB = 兆字节,Mb = 兆位,mb = 毫位

关于java - 如何获取java中堆上所有对象单独消耗的运行时内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18267846/

相关文章:

c++ - 通过类函数在堆上创建对象

java - 计算性能

javascript - 如何测量函数执行所花费的时间

java - android studio 的问题

java - 切片 ByteBuffer 并将数据附加到它的有效方法

java - 如何在运行时向面板添加新组件

java - 唯一约束异常 (SQLIntegrityConstraintViolationException)

iphone - 使用performSelectorInBackground运行加载指示器

c - 当 CPU 需要大于 0xC0000000 的地址时,如何执行地址转换(virt->phy)?

profiling - 什么影响代码的速度?