我想知道如何找出某些线程消耗了多少 RAM。我的程序中有大约 15 个类,每个类都在自己的线程中运行。
那么我如何才能发现 Thread1、Thread2、... Thread15 使用了多少 RAM?有什么方法吗?
感谢您的回复!
简短的回答是所有动态分配的内存(堆)都由所有线程共享,除非您使用 Java 的ThreadLocal 类来声明仅对线程本地的变量。
事实上,线程间共享数据的传统 Java 内存模型(当不使用 ThreadLocal 时)使得线程对于跨线程的内存共享如此强大。
正如 sk4l 提到的,如果您的 JVM 支持,则ThreadMXBean方法有一个 getThreadAllocatedBytes 方法,但请记住,这通常只是一个近似值。
最后,Oracle JDK 和 OpenJDK 的最新版本包括jconsole和 JDK 6u7 以及更高版本的VisualVM,您可以使用其中任何一个来附加到您的进程并查看有关内存和线程的信息。
内存使用取决于 JVM 版本和操作系统。
所有线程共享一个公共堆。它们都有自己的堆栈,通常为 512KB。
有几种方法可以查看每个线程的内存使用情况。首先,检查这个:
所有线程共享所有对象,因此没有人拥有对象。
您可以做的是使用一个内存分析器,例如 VisualVM,它随 JDK 一起免费使用,并查看每个类使用了多少(深大小,而不是浅大小),这将告诉您您想知道什么。
我认为这是不可能的,因为所有线程共享相同的内存堆。线程是一个运行实体,但不是数据所有者。