使用 btrace,我想测试我的函数使用了多少堆,所以我写:
代码上方是我使用的 btrace 示例。
并且两次运行我的功能,我得到了两个不同的结果:
如图所示,堆成本不同:一个是另一个的两倍。
您无法通过在调用方法之前和之后区分 JVM 堆使用情况来判断某个方法需要多少内存。执行该方法时系统中发生了太多事情,而您获得的数字代表 JVM 从操作系统分配的内存 - 结果不会告诉您任何信息。
如果您想要至少可以远程使用的东西,您应该在方法调用(Sys.Memory.dumpHeap(fileName))之前和之后进行堆转储,并使用 heapwalker 来区分这两者。尽管如此,你还是会得到相当多的噪音,但它比依赖操作系统分配的内存要好得多。
最精确的内存跟踪将包括捕获在方法调用期间创建并直接连接到该调用的所有新实例的分配信息 - 例如。在被调用的方法中创建,在从被跟踪的方法中递归调用的所有方法中,以及在被跟踪的方法调用树中任何地方递归生成的所有可运行对象中创建。完成这项工作可能有点棘手,但 BTrace 完全可以实现。