我一直在想,爲什麼Java需要您手動設置堆大小?我的印象是,使用其他語言編寫的程序只會分配儘可能多的內存,直到操作系統不再分配爲止。爲什麼你需要指定Java堆大小?
在Java世界中,我們需要設置堆,堆棧和permgen大小。雖然這很簡單,但忘記將這些數字增加到「足夠大」的數字是我看到服務器故障的首要原因。
爲什麼不可能告訴Java隨着時間的推移需要增加堆/堆棧/ permgen?
我一直在想,爲什麼Java需要您手動設置堆大小?我的印象是,使用其他語言編寫的程序只會分配儘可能多的內存,直到操作系統不再分配爲止。爲什麼你需要指定Java堆大小?
在Java世界中,我們需要設置堆,堆棧和permgen大小。雖然這很簡單,但忘記將這些數字增加到「足夠大」的數字是我看到服務器故障的首要原因。
爲什麼不可能告訴Java隨着時間的推移需要增加堆/堆棧/ permgen?
我的解釋是,Sun是一家專注於銷售Big Boxes的公司,他們喜歡系統管理員可以在這些盒子上做些事情。運行系統來填充所有內存是一種很好的方式,可以將其運行到底層,並且無法有效地採取措施來恢復操作,因爲例如無法分配內存來創建登錄shell。
我認爲,因爲計算機的實際記憶是有限的。因此,從某種意義上說,JVM允許您在全部內存被浪費之前檢測內存。
另外,如果您在同一臺計算機上運行多個JVM,該怎麼做 - 在這種情況下,您如何讓這些JVM中的每一個「儘可能多地增長」?
因爲動態地增加堆,堆棧和permgen大小隻會使服務器無法繼續。在這樣的世界裏,服務器最終會泄漏掉所有的資源。
此外,開發自動內存管理並不像今天這樣成熟。如果選擇了錯誤的默認值,擁有虛擬限制會使事情變得更加簡單,但它可能會使後端的編碼效率降低一些。
是的,這些都是猜測,但是合理的;特別是當您考慮Java/Oak的嵌入式機頂盒編程的起源時。它並不像嵌入式系統將具有交換或磁盤支持的虛擬內存,那麼爲什麼要讓JVM充當可用的虛擬內存呢?
理由三:
您是否有第一點的來源?我從來沒有聽說過「java是爲了編寫web應用程序」的東西(不是我已經深入研究過java的歷史,或者......) – Mike 2010-08-18 22:14:33
神聖失調。Java是Oak的後代,意思是實現機頂盒軟件,就像你可能在複雜的有線電視調諧器中那樣。就垃圾收集而言,當對象不可訪問時收集垃圾,而不是在達到內存限制時收集垃圾。 – 2010-08-18 22:25:18
@Edwin Buck:當對象不可訪問時收集垃圾,而不是在達到內存限制時收集真值,但它們不是「立即」GCd。你必須做多快取決於堆的大小,對於性能可能非常重要。 – 2010-08-18 22:35:34