我想从创建它的应用程序中测量特定Thread的堆使用情况。 该应用程序是多线程的,并且有其他我不想测量的线程。
请不要将我指向个人资料分析器或其他外部报告工具。我只对可以在同一个应用程序中运行的代码感兴趣。
如果可能的话,我正在寻找类似于使用ThreadMXBean
来衡量CPU时间的东西。如果有这样的解决方案,我还没有找到(我已经找了一段时间)。
还有一种方法可以知道线程正在使用哪些内存池吗?我在考虑使用类似
的东西HashSet<String> poolNames = getUsedPoolNames(thisThread);
long heapUsage = 0L;
for(MemoryPoolMXBean bean: ManagementFactory.getMemoryPoolMXBeans()) {
if(poolNames .contains(bean.getName()){
heapUsage += bean.getHeapUsage().getUsage().getUsed();
}
}
这样的事情会起作用吗? getUsedPoolNames(~)
会是什么样的?
内存池和线程是如何链接的?
答案 0 :(得分:2)
我认为API级别的某些东西不会让你这么做。反正不容易。内存并没有真正针对线程保留。内存是针对对象保留的,而对象不是特定于线程的。
有一个漂亮的工具可以通过解析内存转储来完成所有这些,但我不确定它是否适用于实时JVM。
你需要做的是找到与threead相关联的对象(不知道如何做),然后导航它的引用来计算保留堆(因为正在使用的内存不仅仅是对象本身,而且持有引用的对象也会占用内存。这不是一项简单的任务。而且你不会从一个简单的API调用中得到它。而且,它不是特定于线程的,因为另一个线程可能有引用到相同的对象(因为多个线程可以使用对象。
部分原因很难,因为线程/对象意味着对内存池一无所知。这是JVM需要管理的东西。
所以,嗯,不知道。