【发布时间】:2025-12-31 09:30:16
【问题描述】:
我有一些关于Jvm内存管理的问题:
1)如果两个方法或函数在后台连续运行,是否有可能找出哪个占用更多内存?
2) 如果这是可能的,那么我们可以使用 Java 反射来做到这一点吗?
【问题讨论】:
-
在执行你的函数之前/之后放置一个调试日志并在其中打印 jvm 堆内存的差异
我有一些关于Jvm内存管理的问题:
1)如果两个方法或函数在后台连续运行,是否有可能找出哪个占用更多内存?
2) 如果这是可能的,那么我们可以使用 Java 反射来做到这一点吗?
【问题讨论】:
我不确定你所说的“占用更多内存”是什么意思,但绝对有可能找到哪个分配更多的内存。这可以从应用程序内部和外部完成。
private static final com.sun.management.ThreadMXBean threadMXBean =
(com.sun.management.ThreadMXBean) ManagementFactory.getThreadMXBean();
public void myAllocatingMethod() {
long before = threadMXBean.getThreadAllocatedBytes(Thread.currentThread().getId());
// ... some business logic that allocates memory ...
byte[] array = new byte[500000];
long after = threadMXBean.getThreadAllocatedBytes(Thread.currentThread().getId());
System.out.println("Method allocated " + (after - before) + " bytes");
}
注意:这会计算在当前线程上下文中分配的内存。如果一个方法产生新线程或在线程池中执行一些代码,那么如何将分配的内存分配给特定方法并不明显。
使用分配分析器,例如Java Mission Control。
P.S. Java 反射与内存测量无关。
【讨论】: