我该如何通过代码进行Java对象分配跟踪

时间:2018-10-25 00:54:35

标签: java memory garbage-collection profiling

我正在使用Java事件探查器来检查GC性能-但是它非常容易出错。我真正想做的是在我的应用程序中嵌入一些真实世界的配置文件。时间分析非常简单-即标记时间和减去时间,但是我找不到从内存中做任何事情的方法。

本质上-我想做一个这样的功能:

work /
|-- Vagrantfile/
|   |-- project1
|-- |-- | -- project1root
|   |-- project2
|-- |-- | -- project2root
|   |-- project3
|-- |-- | -- project3root

这使我获得有关内存分配的信息,即分配了多少个对象,分配了多少个字节以及可以回收多少内存。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

  • 如果JVM具有大堆,则性能/磁盘空间使用情况
  • 在两个转储之间调用GC中的精确对象分配分析

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