2012-09-12 38 views

回答

8

是與新線程共享的堆和perm gen內存空間還是重新分配?

所有線程(守護進程狀態無關緊要)共享堆和perm內存空間。每個線程都有它自己的堆棧空間,它用來存儲方法字段和調用堆棧。您可以通過changing JVM arguments調整分配的每個線程堆棧空間的大小。但即使這些堆棧區域也是通用JVM堆空間的一部分。

當線程在單獨的CPU中運行時,線程也具有內存緩存。每CPU內存緩存用於性能方面的原因,因此可以出於速度原因更新本地CPU內存,而無需將信息同步到每次訪問的中央存儲。但是這些緩存仍然從一般的JVM內存空間讀取和寫入。

有關守護程序線程真正含義的更多信息,請參見@Peter's answer

+0

接受答案,但我無法驗證其正確性。謝謝,這就是我需要知道的! –

+0

@Josh Harness:很容易驗證它:只讀線程。幾乎任何介紹性的線程文本都會告訴你上述情況。 +1 btw。 – Tudor

+1

你也可以使用['Thread(ThreadGroup,Runnable,String,long)'](http://docs.oracle.com/javase/6/docs/api/java/lang/Thread)動態地改變堆棧大小。 html#線程%28java.lang.ThreadGroup,%20java.lang.Runnable,%20java.lang.String,%20long%29)構造函數。對於可能會深入的進程很有幫助,但您不希望因線程太多而導致出現OutOfMemoryError問題。**編輯:**使用此時請注意可能的平臺特定問題。 – Brian

3

守護進程線程和普通線程之間的唯一顯着區別是它是否會阻止進程停止。普通線程保持JVM運行,守護進程不會。

守護線程具有

  • 具有一個最大尺寸相同的堆。
  • 相同的燙髮也有一個最大尺寸。
  • 相同的線程優先級。
  • 使用相同數量的內存。
  • 堆棧的最大大小相同。

BTW:其他的差異是迂腐,

  • isDaemon()將返回true
  • 守護進程會默認創建守護線程。
  • 將在線程轉儲中顯示爲守護程序。