性能问答>如何获得任意一段代码片段的内存消耗?>
5回复
4年前

如何获得任意一段代码片段的内存消耗?



我最近想对应用中特定算法的不同实现进行性能评估,包括时间消耗和内存消耗。其中,时间消耗比较容易获取,但是不知道怎么获取内存消耗。

目前,从网上找到了一篇文章介绍了一种方法,按照该方法,如果只需要获取整体消耗了多少内容,运行如下代码:

MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
MemoryUsage beforeHeapMemoryUsage = mbean.getHeapMemoryUsage();

Object instance = codeThatCreatesComplexDataStructure();

MemoryUsage afterHeapMemoryUsage = mbean.getHeapMemoryUsage();
long consumed = afterHeapMemoryUsage.getUsed() - 
                beforeHeapMemoryUsage.getUsed();
System.out.println("Total consumed Memory:" + consumed);

如果还需要获取具体的各种数据类型消耗的内存,运行如下代码:

public void memoryHistogram() {
    String name = ManagementFactory.getRuntimeMXBean().getName();
    String PID = name.substring(0, name.indexOf("@"));
    Process p = Runtime.getRuntime().exec("jcmd " + PID + " GC.class_histogram");
    try (BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()))) {
        input.lines().forEach(System.out::println);
    }
}

public void memoryAnalysis(){
    memoryHistogram();
    Object instance = codeThatCreatesComplexDataStructure();
    memoryHistogram();
}

但是,作者说这种方案不适用于多线程程序,因为内存消耗的变化可能是其他线程引起的,会导致结果不准确。然而,我要度量的应用确实是多线程的,不知道有没有大牛知道如何解决这个问题?
感激不尽!

具体方案描述点此链接

5248 阅读
请先登录,查看5条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步