我正在使用Java事件探查器来检查GC性能-但是它非常容易出错。我真正想做的是在我的应用程序中嵌入一些真实世界的配置文件。时间分析非常简单-即标记时间和减去时间,但是我找不到从内存中做任何事情的方法。
本质上-我想做一个这样的功能:
work /
|-- Vagrantfile/
| |-- project1
|-- |-- | -- project1root
| |-- project2
|-- |-- | -- project2root
| |-- project3
|-- |-- | -- project3root
这使我获得有关内存分配的信息,即分配了多少个对象,分配了多少个字节以及可以回收多少内存。
我要结束的是CI系统中的测试,这些测试基本上使诸如函数之类的事情烦恼,从而增加了其内存压力...而且绝对正确-他们实际上知道,这个新函数分配的内存比200个字节多旧的-它不仅仅是随机的时间间隔,在其他线程中可能发生其他各种事情,或者可能发生了垃圾回收。
这可能吗?我知道JVM具有内置的性能分析功能-是否可以从正在运行的程序中访问它-还是有其他方法可以实现我想要的功能?
答案 0 :(得分:0)
对JVM堆转储的分析可以集成到CI中,并且(假设地)为您提供所需的所有信息。
想法很简单,您要在测试函数之前和之后进行堆转储。然后,您可以分析差异并声明要测试的代码的某些SLA。
过去,我是自动进行堆转储分析的,以验证是否正确处理了资源。某些实用程序代码可以作为开源https://github.com/aragozin/heapunit/获得。但是,该库不支持基于堆差异的分析。
使用基于堆转储的方法可能还有其他缺点
如果您只需要跟踪单线程上一段代码分配的字节数,请查看this snippet of code,它使用的是通过JMX提供的每个线程分配计数器。