2011-06-14 40 views
6

Java线程实例化并启动时分配了多少内存(粗略)?创建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(); 
+0

取决于32位或64位的VM。阅读这篇文章:http://www.javaspecialists.eu/archive/Issue029.html但你为什么问?你想开始数千个线程吗? – 2011-06-14 17:31:08

+0

42个字节(正好)。 – 2011-06-14 17:34:51

回答

7

好线程(即对象)本身需要一些空间 - 它确实有十几变量和对象(我太懒惰计算它们应该是正确的),但它应该只有大概200byte(你基本上必须计算所有的基元和引用[微不足道,那些有固定的大小 - 但引用取决于你的VM],然后计算分配的所有对象的大小按类别划分[热点虚拟机每个对象的开销为2个字(如果对象中没有局部变量,则为3)并分配在8字节边界上])

真正需要空间的是线程本地堆栈,并且可能会受VM的-Xss标志影响(尽管请注意,每个OS对最大堆栈空间都有一些限制,您可以在linux中使用-ulimit来影响此操作,并且肯定以某种方式在窗户中)。是

为热点的默认值如下:

在Java SE 6,在Sparc默认为在32位VM 512K,和在1024K的 64位VM。在x86 Solaris/Linux上,其 在32位VM中为320k,而在64位VM中为012k。

在Windows上,从二进制文件 (java.exe)中读取默认线程堆栈 的大小。从Java SE 6开始,这个 的值在32位虚拟机中为320k,在64位虚拟机中则为012k。

+0

谢谢。这非常有帮助。 – 2011-06-16 22:12:23

0

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

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

RGDS, 马丁