2011-06-14 37 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, 馬丁