一般来说,只有设备厂商才关注VM的参数配置,程序开发人员适当了解一些没有什么坏处。下面是dalvik环境下参数的含义
首先来看dalvik.vm.heapgrowthlimit。这个参数控制大多数应用的堆上限,如果应用的heapsize超过了上限就会触发OOM。注意,这里需要区分heapsize和live-object size。前者是一个连续的虚拟空间的大小,后者是已分配对象的大小的总和。考虑到碎片的存在,live-object size小于heapsize。
再来看看dalvik.vm.heapsize。如果应用在manifest中打开了largeheap模式,这个参数将取代heapgrowthlimit成为堆上限。
dalvik.vm.heaptargetutilization实际上是碎片化程度的一个预估,用于估算GC后Heap调整的幅度(使用),默认值为0.75。
dalvik.vm.minfree/maxfree控制单次Heap调整幅度的下限和上限。由于dalvik没有解决碎片化的机制,这个两个数值一般设置较小,用于避免Heap过快增长。
一个容易忽略的配置是lcd_density。这个数值用于为系统的dpi,例如120、160、240、320等,一般会被framework用于选择icon文件。不同分辨率的icon文件在Heap中的bitmap大小会有差异,进而影响Heap的状态。笔者发现有些设备的lcd_density和屏幕实际的ppi有较大的差距,至今不理解其原因。
最后一个容易忽略额的配置是low_mem_mode。对于物理内存较小的设备会打开low memory模式,牺牲性能来换取内存。