gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:21:20 26 4
gpt4 key购买 nike

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

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

如果可能的话,我正在寻找类似于使用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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com