5回复
5年前
如何获得任意一段代码片段的内存消耗?
我最近想对应用中特定算法的不同实现进行性能评估,包括时间消耗和内存消耗。其中,时间消耗比较容易获取,但是不知道怎么获取内存消耗。
目前,从网上找到了一篇文章介绍了一种方法,按照该方法,如果只需要获取整体消耗了多少内容,运行如下代码:
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();
}
但是,作者说这种方案不适用于多线程程序,因为内存消耗的变化可能是其他线程引起的,会导致结果不准确。然而,我要度量的应用确实是多线程的,不知道有没有大牛知道如何解决这个问题?
感激不尽!
5334 阅读