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

标签 java android mobile

在 Android 操作系统的谷歌日历应用程序中,您会在 CalendarActivity 的 onCreate 方法中遇到这一行.

// Eliminate extra GCs during startup by setting the initial heap size to 4MB.
VMRuntime.getRuntime().setMinimumHeapSize(INITIAL_HEAP_SIZE)

有人可以解释为什么将其设置为 4MB 会消除 GC 吗?

最佳答案

JVM 通常从分配一个相对较小的堆开始。然后在每次 GC 运行后,它会检查有多少空闲堆内存。如果空闲堆占总堆的比例太小,JVM 将向堆中添加更多内存(直至配置的最大堆大小)。

第二个相关事实是,当有大量内存需要回收时,GC 运行效率最高。如果您没有遇到总体系统资源限制(例如触发分页或交换),与小堆相比,使用大堆运行可获得更好的应用程序性能。

假设应用程序编写者知道该应用程序很可能需要给定数量的堆(例如 4Mb)才能舒适地运行。通过将该大小设置为最小堆大小,意味着 JVM 不需要在堆填满(例如)1Mb、2​​Mb 和 3Mb 时运行 GC。因此,JVM 在应用程序启动和正常运行期间运行垃圾收集器的次数更少,应用程序启动更快,用户看到的 GC 暂停更少。

关于java - 在 Android 应用程序中设置最小堆大小的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1518154/

相关文章:

java - 如何在 Canvas 上绘制全部大写的文本

Java ThreadPoolExecutor类的beforeExecute()中的参数

macos - Mac 上已更新至 JDK7,现在出现 AquaTableUI 异常

java - 在 Android 中长按单个项目时,如何更改所有 RecyclerView 项目的可见性?

jquery - 在没有 <input type ="number"> 的情况下在移动设备上调出小键盘

javascript - JQuery Mobile 默认数据主题

android - 如何仅在 Flutter 的 datepicker 中显示年份?

java - 无法使用 Gson 将 JSON 反序列化为 HashMAp<String, POJO>

android - Flutter:app/build 文件夹和文件是否应该包含在 git 忽略中?

android - 隐藏在抽屉导航后面的 float 操作按钮