找出Thread使用了多少RAM

时间:2013-07-13 14:58:36

标签: java memory

我想知道如何找出某些线程消耗了多少RAM。 在我的程序中有大约15个类,每个类都在自己的Thread中运行。

那么如何才能发现Thread1,Thread2,... Thread15使用了多少RAM?对此有什么方法吗?

感谢您的回复!

4 个答案:

答案 0 :(得分:3)

内存使用情况取决于JVM版本和操作系统。

所有线程共享一个公共堆。它们都有自己的堆栈,通常是512KB。

有几种方法可以查看每个线程内存的使用情况。首先,检查一下:

http://docs.oracle.com/javase/6/docs/jre/api/management/extension/com/sun/management/ThreadMXBean.html#getThreadAllocatedBytes%28long%29

答案 1 :(得分:3)

简短的回答是所有线程都共享所有动态分配的内存(堆),除非您使用Java的ThreadLocal class来声明仅对该线程本地的变量。

事实上,线程之间的traditional Java memory model共享数据(当不使用ThreadLocal时)使得线程对于跨线程的内存共享非常强大。

正如sk4l所提到的,如果你的JVM支持它,那么ThreadMXBean方法有一个getThreadAllocatedBytes方法,但请记住这通常只是一个近似值。

最后,Oracle JDK和OpenJDK的最新版本包括jconsole和JDK 6u7以及更高版本的VisualVM,其中任何一个都可用于附加到您的进程并查看有关内存和线程的信息。

答案 2 :(得分:2)

所有线程共享所有对象,因此没有人拥有对象。

你可以做的是使用内存分析器,例如使用JDK免费的VisualVM,并查看每个类使用了多少(深度大,不是浅的大小),这将告诉你你想知道什么。

答案 3 :(得分:0)

我不认为这是可能的,导致所有线程共享相同的内存堆。线程是一个正在运行的实体,但不是数据所有者。