获取java类中方法使用的堆内存

获取java类中方法使用的堆内存,java,Java,我正在编写一个java代码,我想运行一些性能测试。 我只想获取类中一个方法使用的堆内存 public AccessControl { public boolean Allowed () { code } public void print () { code } } 我希望每次在运行时调用允许的方法时,都能获得java中使用的堆内存。我读到我可以通过HPROf来做,但我注意到HPROf不为方法提供内存计算,而只为类提供内存计算。

我正在编写一个java代码,我想运行一些性能测试。 我只想获取类中一个方法使用的堆内存

 public AccessControl {

     public boolean Allowed () {
        code
        }
     public  void print () {
    code }
}
我希望每次在运行时调用允许的方法时,都能获得java中使用的堆内存。我读到我可以通过HPROf来做,但我注意到HPROf不为方法提供内存计算,而只为类提供内存计算。我是否可以在方法中编写代码来获得可用内存,然后是已使用的内存?谢谢

没有“方法使用的堆内存”这样的东西。方法不占用堆内存,对象占用

如果您对在特定方法中创建的对象感兴趣(当然,还有它直接或间接调用的方法),可以比较在方法调用之前和之后创建的堆快照(可以通过在调试器中运行并设置断点来实现)


但你想解决什么实际问题呢?通常,诊断内存泄漏的方法是首先查找明显不必要对象的GC根,然后使用调试器找出设置这些引用的位置和原因。

我建议在分析时,不要通过引入新代码来影响结果。如果无法解决问题,则可以使用调试器并在要分析的位置周围应用断点。你也可以试试。我建议您不要只关注代码中的某个特定位置,而要先看全局。否则您将面临风险。

可用于分析内存分配。在跟踪模式下,此工具可用于跟踪

您可以使用#tracetarget-org.yourcode.YourClass选项来获取“分配类”输出,以显示类内每个方法的内存分配


但是,您只能分别为每个分配的类配置内存分配。目前没有在所有分配的类中给出摘要。如果您非常感兴趣,可以使用git fork InMemProfiler并尝试添加此功能。

如果您使用oracle jvm,您可以做到

ThreadMXBean threadmx = ManagementFactory.getThreadMXBean();
long startbyte = ((com.sun.management.ThreadMXBean)threadmx)
    .getThreadAllocatedBytes(Thread.currentThread().getId());
//call method
int usedbyte = ((com.sun.management.ThreadMXBean)threadmx)
    .getThreadAllocatedBytes(Thread.currentThread().getId())-startbyte;

一种方法是使用内存分析器,如,但如果您只想查看一组语句使用的内存,请使用下面的代码

Runtime runtime = Runtime.getRuntime();
long memoryUsedBefore = runtime.totalMemory() - runtime.freeMemory();
System.out.println("Memory used before: " + memoryUsedBefore );
    // set of memory consumption statements here
long memoryUsedAfter = runtime.totalMemory() - runtime.freeMemory();
System.out.println("Total Memory increased:" + (memoryUsedAfter - memoryUsedBefore ));

是的,我对在方法中创建的对象感兴趣。我没有问题,我只是想评估我的方法的性能(通过评估所需的时间和内存)我无法调试,因为该方法被调用了很多次,我希望该类中的对象使用的内存被计算并发送到一个文件中,在运行结束后可以查看该文件complete@Sara:堆内存的要点是由整个应用程序共享。方法创建对象,然后由许多其他方法使用。这就是为什么没有办法收集这个有问题的指标。好的,谢谢你的澄清。我看看该怎么办。关键是我创建了应用程序的一个组件,我应该测试它的性能,这就是为什么我感到困惑。