gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:42:35 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com