gpt4 book ai didi

java - 我怎样才能用代码进行java对象分配跟踪

转载 作者:行者123 更新时间:2023-12-02 10:40:02 25 4
gpt4 key购买 nike

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

本质上 - 我想创建一个像这样的函数:

 ProfileResult  profile( Runnable function)

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

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

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

最佳答案

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

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

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

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

  • 性能/磁盘空间使用情况(如果 JVM 具有较大堆)
  • 在两次转储之间调用 GC 中的准确对象分配分析

如果您只需要跟踪单线程上的代码片段分配的字节数,请查看 this snippet of code它使用通过 JMX 提供的每线程分配计数器。

关于java - 我怎样才能用代码进行java对象分配跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52979844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com