我的Java线程占用多少内存?

19

有没有办法找出我的Java线程在虚拟机中占用了多少内存?

例如,使用堆栈跟踪转储或其他手段。

谢谢。


你应该试用一下VisualVM这个工具。 - Vinay Pai
7
太阳一定在倾听——你可以使用特定于平台的ThreadMXBean上的新接口来获取每个线程的内存使用情况:http://download.oracle.com/javase/6/docs/jre/api/management/extension/com/sun/management/ThreadMXBean.html#getThreadAllocatedBytes%28long%29 - BeeOnRope
@BeeOnRope,这是非常棒的答案!您应该将其发布为答案,我会投票支持它。 - Hendy Irawan
1
@HendyIrawan,实际上它最初是一个帖子,但似乎被版主删除并转换为评论。不确定为什么... - BeeOnRope
1个回答

24

Java线程使用堆作为共享内存。每个线程都有自己的栈(可以通过-Xss命令行选项设置其大小,默认为512KB),但是所有其他内存(堆)并不属于特定的线程,询问一个特定线程使用了多少堆内存就没有意义。


但在我的系统中,所有线程都执行类似的功能。因此,为了获得大致的图片,我考虑获取堆的大小并将其除以线程数,以获取每个线程所占用的大致大小.. 这是一个公平的假设吗? - Vikas Jain
8
线程栈大小:在32位VM中,x86 Solaris/Linux的线程栈大小为320k,在64位VM中为1024k。在Windows中,32位VM的线程栈大小为320k,而64位VM的线程栈大小也是1024k。(来源) - Ricket
@MichaelBorgwardt 这些信息的使用场景可能是,例如确定是否有一些类似的线程浪费了太多的内存。例如,当线程使用用户给定的参数并且用户发现角落情况并将您的线程发送到无限循环时,在其中扩展某些集合大小。在这种情况下,能够看到任何线程本身使用了多少不与其他线程共享的内存是很好的。 - Lauri
1
@Lauri:根据定义,所有堆内存都是在所有线程之间共享的。 - Michael Borgwardt
我不知道...我认为这个问题在某种程度上是有效的。我同意,在大多数情况下(即堆栈大小,你通过指定默认值为512kB来回答),微观管理线程消耗的内存有点荒谬。但现在我正在与某人争论一个进程存在大量线程的问题,没有为其分配足够的堆大小以允许每个线程使用内存堆栈,并且主张出于这个原因永远不要使用线程池,我认为这是荒谬的。线程内存占用对于堆栈大小是相关的。 - searchengine27
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接