2009-10-05 76 views

回答

16

JVM通常從分配相對較小的堆開始。然後在每次GC運行後,檢查是否有多少空閒堆內存。如果空閒堆佔總堆的比例過小,則JVM將向堆中添加更多內存(直至配置的最大堆大小)。

第二個相關事實是,當有大量內存需要回收時,GC運行效率最高。假設您沒有遇到整個系統資源限制(例如,觸發分頁或交換),通過使用大堆運行而不是小分區,可以獲得更好的應用程序性能。

假設應用程序編寫者知道應用程序最可能需要給定數量的堆(例如4Mb)來舒適地運行。通過將該大小設置爲最小堆大小意味着當堆滿(例如)1Mb,2Mb和3Mb時,JVM不需要運行GC。因此,JVM在應用程序啓動和正常運行期間運行垃圾回收器次數更少,應用程序啓動速度更快,用戶看到更少的GC暫停。

+1

分析器是否有助於估計初始啓動堆的需求? – 2009-10-05 10:06:22

+1

不是直接。假設您在應用程序「啓動」時獲取的快照上運行分析器。這告訴你在那個時候對象是如何存在的,但不是1)* bootstrapping期間最大工作集的數量*,或者2)當應用程序開始做時,將消耗多少額外內存。簡而言之,引導後的工作集規模可能是一個糟糕的估計。 – 2011-03-06 05:52:10