2009-10-05 104 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

相关问题