如何在同一个应用程序中获得运行时单个线程的堆使用?

时间:2014-01-08 02:46:47

标签: java multithreading performance

我想从创建它的应用程序中测量特定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(~)会是什么样的? 内存池和线程是如何链接的?

1 个答案:

答案 0 :(得分:2)

我认为API级别的某些东西不会让你这么做。反正不容易。内存并没有真正针对线程保留。内存是针对对象保留的,而对象不是特定于线程的。

有一个漂亮的工具可以通过解析内存转储来完成所有这些,但我不确定它是否适用于实时JVM。

你需要做的是找到与threead相关联的对象(不知道如何做),然后导航它的引用来计算保留堆(因为正在使用的内存不仅仅是对象本身,而且持有引用的对象也会占用内存。这不是一项简单的任务。而且你不会从一个简单的API调用中得到它。而且,它不是特定于线程的,因为另一个线程可能有引用到相同的对象(因为多个线程可以使用对象。

部分原因很难,因为线程/对象意味着对内存池一无所知。这是JVM需要管理的东西。

所以,嗯,不知道。