创建Java线程时的内存使用量

时间:2011-06-14 17:20:50

标签: java multithreading

实例化和启动Java线程时分配了多少内存(大致)?

以下是代码示例:

// Definition of the thread class
class BasicThread extends Thread {
    // This method is called when the thread runs
    public void run() {
    }
}
.
.
.
// Create and start the thread
Thread thread = new BasicThread();
thread.start();

2 个答案:

答案 0 :(得分:7)

线程(即对象)本身需要一些空间 - 它确实有十几个变量和对象(而且我太懒了,无法正确计算它们)但它应该只有200byte(您基本上必须计算所有原语和引用[平凡,那些具有固定大小 - 但引用依赖于您的VM]然后计算由类分配的所有对象的大小[热点VM具有2个字的开销每个对象(如果对象中没有局部变量,则为3)并在8字节边界上分配])

真正占用空间的是线程本地堆栈,它可以受到VM的-Xss标志的影响(尽管请注意每个操作系统对最大堆栈空间有一些限制,你可以用linux中的-ulimit来影响它,当然不知何故在Windows中)。

热点的默认值如下:

  

在Java SE 6中,Sparc的默认值为   32位VM中512k,1024k   64位虚拟机。在x86 Solaris / Linux上   在32位VM中是320k,在1024k中是   64位虚拟机。

     

在Windows上,默认线程堆栈   从二进制文件中读取大小   (java.exe的)。截至Java SE 6,这个   32位VM中的值为320k   64位VM中的1024k。

答案 1 :(得分:0)

IIRC,32位Windows为初始线程堆栈保留了64K的“真实”物理RAM。也许内核可能会保留另一页非分页内存,但基本上,唯一重要的初始保留是新线程的堆栈。如果此堆栈被烧毁,则虚拟内存管理器将其增加到exe标头中的读取限制,并且通常在链接时设置。 IIRC,此限制不能低于1MB。

不知道Linux-32的行为方式。据推测,有点类似。

RGDS, 马丁