簡體   English   中英

為什么 Java 使用靜態堆而不是允許任意數量的內存?

[英]Why does Java use a static heap rather than allow an arbitrary amount of memory?

在 Java 中,虛擬機預先分配了一個無法在運行時擴展的內存堆。 開發人員可以在 VM 加載時使用 -Xmx 開關增加堆的大小,但無法在運行時增加堆的最大大小。 為什么是這樣?

碎片是內存分配中的一個大問題,內存不足也是如此。 如果您可以分配和保留所需的內存,那么它會簡單得多,而且不容易出錯,尤其是在服務器環境中。 通過預先分配內存,您也有更高的概率連續分配大部分內存(不能保證,謝謝@mttdbrd),這可以更快地訪問。

回到 Java 剛開始的時候,內存超過 1GB 的安裝幾乎聞所未聞,相反,我們不得不使用只有 256MB 內存的機器,有時甚至更少! 再加上 RAM 的速度有多慢,能夠讀寫有望連續分配的塊更有意義。 您也不會不斷地敲打操作系統來為您提供更多 RAM,然后再次釋放它,從而釋放(當時)寶貴的 CPU 周期。

在那種環境下,很容易突然耗盡內存,因此能夠分配您可能需要的內容並確保在時機成熟時擁有它是很有意義的。

這些天,我想 RAM 變得更容易訪問了,這變得不那么有意義了,但是,當我查看我的服務器以及如何分配內存時,我喜歡這樣一個事實,即我所有的 Java 應用程序都有很好的,大部分是連續分配的塊與無處不在的其他一些應用程序相比,內存不足。

這也是為什么你不能在運行時增加堆的原因,沒有辦法保證你將有一個連續的分配。

根據 JVM 規范,沒有理由為什么必須提前指定堆大小,除非它是實現者的選擇。 該規范指出:“Java 虛擬機實現可以為程序員或用戶提供對堆初始大小的控制,以及如果堆可以動態擴展或收縮,則可以控制最大和最小堆大小。”

這里的其他答案都是錯誤的:“堆可能是固定大小,也可能根據計算需要擴展,如果不需要更大的堆,可能會收縮。”

來源:Java 虛擬機規范,Java SE 7 版。 第 2.5.3 節,“堆”。 那是印刷版的第 13 頁。

當您的代碼開始工作時,JVM 已經創建並配置好了。 此外,此限制保證程序不會占用所有可用的系統資源,無論其代碼有多糟糕,都會破壞服務器上其他應用程序的正常運行。 ;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM