在Android应用程序中设置最小堆大小的目的是什么?

7
在安卓操作系统的谷歌日历应用中,你会在CalendarActivity的onCreate方法中遇到这一行代码。 CalendarActivity是指日历应用的主活动页面。
// Eliminate extra GCs during startup by setting the initial heap size to 4MB.
VMRuntime.getRuntime().setMinimumHeapSize(INITIAL_HEAP_SIZE)

有人能解释一下为什么将其设置为4MB会消除GC吗?
1个回答

16

Java虚拟机(JVM)一般会分配一个相对较小的堆空间。然后在每次垃圾回收运行后,它会检查可用的堆内存量。如果可用堆内存与总堆内存的比例太小,JVM将增加更多内存到堆中(最高配置堆大小为上限)。

第二个相关的事实是,当有大量内存可用于回收时,垃圾回收运行得最有效。只要不超过系统资源限制(例如触发分页或交换),使用大堆比使用小堆可以获得更好的应用程序性能。

假设应用程序编写者知道该应用程序需要一定数量的堆空间(例如4MB)才能舒适地运行。通过将该大小设置为最小堆大小,意味着JVM在堆填满时(例如1MB,2MB和3MB)无需运行垃圾回收。结果是,在应用程序启动和正常运行期间,JVM运行垃圾收集器的次数更少,应用程序启动更快,并且用户看到的垃圾收集暂停更少。


1
使用分析器能帮助估算初始启动堆需求吗? - Jacques René Mesrine
1
不是直接的。假设您在应用程序“启动”时拍摄快照并运行分析器。这告诉您对象在那一点上的存在方式,但不会告诉您1)引导期间最大工作集是多少,或者2)应用程序开始执行操作时将消耗多少额外内存。简而言之,在引导后的工作集大小可能是一个不准确的估计。 - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接