java - 如何获取同一应用程序中运行时单个线程的堆使用情况?

标签 java multithreading performance

我想测量创建特定线程的应用程序内的堆使用情况。 该应用程序是多线程的,并且具有我对测量不感兴趣的其他线程。

请不要将我指向分析器或其他外部报告工具。我只对可以在同一应用程序中运行时运行的代码感兴趣。

如果可能的话,我正在寻找类似于使用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(~) 会是什么样子? 内存池和线程是如何关联的?

最佳答案

我认为 API 级别上没有任何东西可以帮助您实现这一点。无论如何,并不容易。内存并不是真正为线程保留的。内存是针对对象保留的,并且对象不是特定于线程的。

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

您需要做的是找到与 Threead 关联的对象(不知道如何执行此操作),然后导航其引用以计算保留的堆(因为所使用的内存不仅仅是对象本身,而且其引用所保存的对象也会占用内存。这不是一个简单的任务。而且您不会从简单的 API 调用中获取它。此外,它并不是真正特定于线程的,因为另一个线程可能拥有引用相同的对象(因为对象可以被多个线程使用。

其中一部分很困难,因为线程/对象不了解内存池。这是 JVM 需要管理的事情。

所以,嗯,不知道。

关于java - 如何获取同一应用程序中运行时单个线程的堆使用情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20986070/

相关文章:

java - 通用子类型和通配符在 Collections.copy 中如何工作?

multithreading - 只有 dlmopen 而不是 dlopen 的未解析符号

json - Encoding.com 转码速度

python - 为什么使用属性而不是方法可以显着提高 Python 速度

java - 相当于 javac ant 任务的命令行?

java - 使用 null 而不是默认值可以获得性能提升?

java - Akka调度程序: How akka scheduler work?

ruby-on-rails - 追踪导致 rspec 测试缓慢的原因

java - bufferedReader 中的读取行

python - Python 中的线程 : class attribute (list) not thread-safe?