如何使用代码进行 java 对象分配跟踪

Posted

技术标签:

【中文标题】如何使用代码进行 java 对象分配跟踪【英文标题】:how can I do java object allocation tracing from with code 【发布时间】:2018-10-25 00:54:35 【问题描述】:

我正在使用 java 分析器来检查 GC 性能 - 但它非常受欢迎。我真正想做的是将一些真实世界的分析嵌入到我的应用程序中。时间分析非常容易 - 即标记时间和减法,但我无法从内存中找到任何方法。

基本上 - 我想做一个这样的函数:

 ProfileResult  profile( Runnable function)

这给了我关于内存分配的信息 - 即有多少对象,分配了多少字节 - 以及其中有多少可以被垃圾收集。

我想要结束的是在我们的 CI 系统中进行的测试,这些测试基本上对诸如函数增加内存压力之类的事情感到不安......这绝对是正确的 - 他们实际上知道这个新函数分配了 200 个字节多于旧的 - 它不仅仅是一个随机的时间片段,在其他线程中可能发生各种其他事情,或者可能发生垃圾收集或其他任何事情。

这可能吗?我知道 JVM 具有内置的分析功能 - 是否可以从正在运行的程序中访问它 - 或者有没有其他方法可以实现我想要的?

【问题讨论】:

【参考方案1】:

JVM 堆转储的分析可以集成到 CI 中,并且(假设地)为您提供您正在寻找的所有信息。

想法很简单,您在测试函数之前和之后进行堆转储。然后您可以分析差异并断言正在测试的代码的某些 SLA。

过去,我通过自动堆转储分析来验证资源处置是否正确。一些实用程序代码可作为开源 https://github.com/aragozin/heapunit/ 获得。不过,该库不支持基于堆差异的分析。

使用基于堆转储的方法可能还有其他缺点

如果你的 JVM 有大堆,性能/磁盘空间使用率 在 GC 中准确的对象分配分析在两个转储之间调用

如果您只需要跟踪单线程上一段代码分配的字节数,请查看this snippet of code,它正在使用可通过 JMX 获得的每个线程分配计数器。

【讨论】:

以上是关于如何使用代码进行 java 对象分配跟踪的主要内容,如果未能解决你的问题,请参考以下文章

如何跟踪 YOLOv3 产生的输出?

目标跟踪(5)使用 Opencv 和 Python 进行对象跟踪

java 怎么对一个对象强制垃圾回收

如何在 C++ 中跟踪内存分配(尤其是新建/删除)

JVM中的本机内存跟踪

Java如何分配和回收内存?Java垃圾收集器如何工作?