2010-08-18 35 views
17

我一直在想,爲什麼Java需要您手動設置堆大小?我的印象是,使用其他語言編寫的程序只會分配儘可能多的內存,直到操作系統不再分配爲止。爲什麼你需要指定Java堆大小?

在Java世界中,我們需要設置堆,堆棧和permgen大小。雖然這很簡單,但忘記將這些數字增加到「足夠大」的數字是我看到服務器故障的首要原因。

爲什麼不可能告訴Java隨着時間的推移需要增加堆/堆棧/ permgen?

回答

4

我的解釋是,Sun是一家專注於銷售Big Boxes的公司,他們喜歡系統管理員可以在這些盒子上做些事情。運行系統來填充所有內存是一種很好的方式,可以將其運行到底層,並且無法有效地採取措施來恢復操作,因爲例如無法分配內存來創建登錄shell。

4

我認爲,因爲計算機的實際記憶是有限的。因此,從某種意義上說,JVM允許您在全部內存被浪費之前檢測內存。
另外,如果您在同一臺計算機上運行多個JVM,該怎麼做 - 在這種情況下,您如何讓這些JVM中的每一個「儘可能多地增長」?

1

因爲動態地增加堆,堆棧和permgen大小隻會使服務器無法繼續。在這樣的世界裏,服務器最終會泄漏掉所有的資源。

此外,開發自動內存管理並不像今天這樣成熟。如果選擇了錯誤的默認值,擁有虛擬限制會使事情變得更加簡單,但它可能會使後端的編碼效率降低一些。

是的,這些都是猜測,但是合理的;特別是當您考慮Java/Oak的嵌入式機頂盒編程的起源時。它並不像嵌入式系統將具有交換或磁盤支持的虛擬內存,那麼爲什麼要讓JVM充當可用的虛擬內存呢?

7

理由三:

  1. 因爲Java的用意是用於編寫Web應用程序的語言。一般認爲讓Web應用程序接管所有機器資源通常不是一個好主意。
  2. 因爲Java是垃圾收集。除了指定內存的上限外,堆大小也會觸發垃圾回收。基本上你說「你可以使用這麼多,但是當你達到這個極限時,你必須整理好」。
  3. 有許多應用程序類別,您希望限制Java進程使用的內存量,例如,在兩者都沒有足夠內存的情況下,更重要的是其他進程繼續進行。
  4. 因爲能夠限制堆大小是一個功能。如果你喜歡這個過程可以擁有無​​限內存的方法(就像其他語言中提到的那樣),那麼你總是可以將堆的限制設置得比它可能獲得的更多。如果你想限制堆大小,你可以做到這一點。其他語言只有這些可能的行爲之一,使他們不那麼靈活。
+2

您是否有第一點的來源?我從來沒有聽說過「java是爲了編寫web應用程序」的東西(不是我已經深入研究過java的歷史,或者......) – Mike 2010-08-18 22:14:33

+2

神聖失調。Java是Oak的後代,意思是實現機頂盒軟件,就像你可能在複雜的有線電視調諧器中那樣。就垃圾收集而言,當對象不可訪問時收集垃圾,而不是在達到內存限制時收集垃圾。 – 2010-08-18 22:25:18

+0

@Edwin Buck:當對象不可訪問時收集垃圾,而不是在達到內存限制時收集真值,但它們不是「立即」GCd。你必須做多快取決於堆的大小,對於性能可能非常重要。 – 2010-08-18 22:35:34

相關問題