java - 由于 freeMemory() 仅报告长期存在的对象,如何跟踪 Java 中的任何对象创建?

标签 java optimization garbage-collection jmx

每当我的 JVM 创建一个新对象时,我都想在日志中打印一些内容。我试图使用 Runtime.getRuntime().freeMemory() 来检测它,但不幸的是,在它被提升到堆(check here for more details)之前,它没有考虑任何短暂的对象。

那么有人知道如何检测/跟踪我的 JVM 实例化/创建对象的时间吗?为了方便起见,我们如何完成下面的代码:

随意使用 MemoryPoolMXBean 和 JMX:

public class MemoryUtils {

    private static Set<String> set = new HashSet<String>();

    public static void main(String[] args) {

        // START

        // now create a bunch of objects and save them in the set
        for (int i = 0; i < 100; i++) {
            set.add(new String("foo" + i));
        }

        // FINISH

        // FIXME: Do something here to detect that a bunch of objects were created!

    }
}

编辑:尝试下面 Vladimir 提出的解决方案:

它有效,但有一个奇怪的副作用:

long t = totalThreadMemoryAllocated();

// did nothing

t = totalThreadMemoryAllocated() - t;

System.out.println(t); // ==> 48 !!!???

public static long totalThreadMemoryAllocated() {
    com.sun.management.ThreadMXBean tBean = (com.sun.management.ThreadMXBean) ManagementFactory.getThreadMXBean();
    return tBean.getThreadAllocatedBytes(Thread.currentThread().getId());
}

但它确实考虑了任何对象的创建,所以我想如果我从中减去魔数(Magic Number) 48 就可以使用它。

最佳答案

您可以使用 Java 代理来执行此操作,可以通过作者的博客找到开源实现 - http://jeremymanson.blogspot.co.uk/2012/02/update-to-allocation-instrumenter.html

关于java - 由于 freeMemory() 仅报告长期存在的对象,如何跟踪 Java 中的任何对象创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9810212/

相关文章:

java - 堆增长和下降

java - boolean 值总是返回 true?

java - 将字符串 "1 + 2"转换为整数

algorithm - 在 C++ 中寻找优化算法来替换 Excel Solver

linux - 如何最有效地处理大量文件描述符?

memory-management - 分配给线程的栈内存从哪里来?

c# - 构造函数抛出异常,实例和内存分配发生了什么?

java - Eclipse 错误 com.google.android.gms.ads 无法解析

java - 保存生成的数组

c++ - 你能在 C++ 内联汇编中建议我更好的解决方案吗?