当前位置: 首页 > 工具软件 > Dalvik > 使用案例 >

Android 4.4 如何修改Dalvik虚拟机内存分配

邵捷
2023-12-01

功能:通过修改Dalvik虚拟机内存分配并且来降低系统GC回收导致CPU使用率高的问题,这样修改可以降低CPU使用率5%
虚拟机的几个重要参数说明:
dalvik.vm.heapstartsize
堆分配的初始大小,调整这个值会影响到应用的流畅性和整体ram消耗。这个值越小,系统ram消耗越慢,但是由于初始值较小,一些较大的应用需要扩张这个堆,从而引发gc和堆调整的策略,会应用反应更慢。相反,这个值越大系统ram消耗越快,但是程序更流畅。
dalvik.vm.heapgrowthlimit
极限堆大小,dvm heap是可增长的,但是正常情况下dvm heap的大小是不会超过dalvik.vm.heapgrowthlimit的值。如果受控的应用dvm heap size超过该值,则将引发oom。

dalvik.vm.heapsize
使用大堆时,极限堆大小。一旦dalvik heap size超过这个值,直接引发oom。在android开发中,如果要使用大堆,需要在manifest中指定android:largeHeap为true。这样dvm heap最大可达dalvik.vm.heapsize。

[dalvik.vm.heaptargetutilization]: [0.75] 可以设定内存利用率的百分比,当实际的利用率偏离这个百分比的时候,虚拟机会在GC的时候调整堆内存大小,让实际占用率向个百分比靠拢。

上面的几个参数是与虚拟机的内存分配相关的,虚拟机的内存分配过程是下面这样的

1 首先判断一下需要申请的size是不是过大,如果申请的size超过了堆的最大限制,则转入步骤6

2 尝试分配,如果成功则返回,失败则转入步骤3

3 判断是否gc正在进行垃圾回收,如果正在进行则等待回收完成之后,尝试分配。如果成功则返回,失败则转入步骤4

4 自己启动gc进行垃圾回收,这里gcForMalloc的参数是false。所以不会回收软引用,回收完成后尝试分配,如果成功则返回,失败则转入步骤5

5 调用dvmHeapSourceAllocAndGrow尝试分配,这个函数会扩张堆。所以heap startup的时候可以给一个比较小的初始堆,实在不够用再调用它进行扩张

6 进入回收软引用阶段,这里gcForMalloc的参数是ture,所以需要回收软引用。然后调用dvmHeapSourceAllocAndGrow尝试分配,如果失败则抛出OOM。

实例实战:
需求:如何将512内存修改为1G内存
代码路径:
device/sprd/sharkle/common/feature_phone_512_ram_conf.mk
/frameworks/native/build/phone-hdpi-512-dalvik-heap.mk
device/sprd/sharkle/sp9820e_1h10/sp9820e_1h10_base.mk
/system/build.prop
根据512内存模版来创建feature_phone_1024_ram_conf.mk文件

MALLOC_IMPL := dlmalloc
PRODUCT_RAM := low

$(call inherit-product, frameworks/native/build/phone-mdpi-1024-dalvik-heap.mk)

# set LMK watermark as {18M,30M,54M,66M,78M,90M}
PRODUCT_PROPERTY_OVERRIDES += \
	   ro.board_ram_size=mid \
	   ro.config.low_ram=true \
           sys.lmk.adj=0,1,2,3,9,15 \
           sys.lmk.minfree=4608,7680,13824,16896,19968,23040

根据512内存模版来创建phone-mdpi-1024-dalvik-heap.mk文件

#
# Copyright (C) 2010 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# Provides overrides to configure the Dalvik heap for a standard high density
# phone with around 512MB total RAM.

PRODUCT_PROPERTY_OVERRIDES += \
    dalvik.vm.heapstartsize=8m \
    dalvik.vm.heapgrowthlimit=64m \
    dalvik.vm.heapsize=256m \
    dalvik.vm.heaptargetutilization=0.75 \
    dalvik.vm.heapminfree=512k \
    dalvik.vm.heapmaxfree=8m

在sp9820e_1h10_base.mk文件中把刚创建的1G内存文件参与编译进来,并且通过添加变量来控制是否编译进来

ifeq ($(wq_ram),1G)
$(call inherit-product, $(PLATCOMM)/feature_phone_1024_ram_conf.mk)
else
$(call inherit-product, $(PLATCOMM)/feature_phone_512_ram_conf.mk)
endif

在脚本中使用该变量

export wq_ram=1G

验证修改是否正确,在我们正编译软件的时候,会把该变量输出到build.prop文件中,我们可以查看该文件中是否添加成功

dalvik.vm.heapstartsize=8m
dalvik.vm.heapgrowthlimit=64m
dalvik.vm.heapsize=256m
dalvik.vm.heaptargetutilization=0.75
dalvik.vm.heapminfree=512k
dalvik.vm.heapmaxfree=8m
 类似资料: