繁体   English   中英

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

[英]how can I do java object allocation tracing from with code

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

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

 ProfileResult  profile( Runnable function)

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM