如何使用代码进行 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 对象分配跟踪的主要内容,如果未能解决你的问题,请参考以下文章