【问题标题】:Java function/method memory managementJava函数/方法内存管理
【发布时间】:2025-12-31 09:30:16
【问题描述】:

我有一些关于Jvm内存管理的问题:

1)如果两个方法或函数在后台连续运行,是否有可能找出哪个占用更多内存?

2) 如果这是可能的,那么我们可以使用 Java 反射来做到这一点吗?

【问题讨论】:

  • 在执行你的函数之前/之后放置一个调试日志并在其中打印 jvm 堆内存的差异

标签: java jvm


【解决方案1】:

我不确定你所说的“占用更多内存”是什么意思,但绝对有可能找到哪个分配更多的内存。这可以从应用程序内部和外部完成。

应用程序内部

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 反射与内存测量无关。

【讨论】: