每当我的 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/