ThreadMXBean.getThreadAllocatedBytes может помочь:
com.sun.management.ThreadMXBean bean =
(com.sun.management.ThreadMXBean) ManagementFactory.getThreadMXBean();
long currentThreadId = Thread.currentThread().getId();
long before = bean.getThreadAllocatedBytes(currentThreadId);
allocatingMethod();
long after = bean.getThreadAllocatedBytes(currentThreadId);
System.out.println("Allocated " + (after - before) + " bytes");
Метод возвращает приближение общего объема выделенной памяти, но обычно это приближение довольно точное.
Кроме того, asyn c -profiler имеет Java API для профилирования распределений. Он не только подсчитывает, сколько объектов выделено, но также показывает точные выделенные объекты со следами стеков сайтов выделения.
public static void main(String[] args) throws Exception {
AsyncProfiler profiler = AsyncProfiler.getInstance();
// Dry run to skip allocations caused by AsyncProfiler initialization
profiler.start("alloc", 0);
profiler.stop();
// Real profiling session
profiler.start("alloc", 0);
allocatingMethod();
profiler.stop();
profiler.execute("file=alloc.svg"); // save the output to alloc.svg
}
Как запустить:
java -Djava.library.path=/path/to/async-profiler -XX:+UseG1GC -XX:-UseTLAB Main
* Для записи всех выделений требуется 1018 * опций. В противном случае asyn c -profiler будет работать в режиме выборки, записывая только небольшую часть выделений.
Вот как будет выглядеть вывод:
![Allocation graph by async-profiler](https://i.stack.imgur.com/rz5Hf.png)