Всякий раз, когда моя JVM создает новый объект, я хочу что-то напечатать в журнале. Я пытался обнаружить это с помощью Runtime.getRuntime (). FreeMemory (), но, к сожалению, он НЕ учитывает какой-либо недолговечный объект до тех пор, пока он не переведен в кучу ( проверьте здесь более подробную информацию ).
Так кто-нибудь знает, как обнаруживать / отслеживать каждый раз, когда объект создается / создается моей 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!
}
}
Редактировать: Попробовать решение, предложенное Владимиром ниже:
Работает, но со странным побочным эффектом:
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());
}
Но он ДЕЙСТВИТЕЛЬНО учитывает создание любого объекта, поэтому я думаю, что мог бы использовать это, если вычту из него магическое число 48.