Android dalvik GC相关的属性详解

原创 2015年11月17日 19:41:43

在dalvik中,GC的类型有三种:

1、GC_EXPLICIT:

    应用主动调用System.gc()产生的GC事件。

2、GC_FOR_ALLOC:

    内存分配时,发现可用内存不够时触发的GC事件。

3、GC_CONCURRENT:

   给java层的class分配内存后,计算已分配的大小达到阈值(当前DVM heap size小一点)时会触发的GC事件。

因为第2和第3中GC是由系统触发的,所以应用是无法减少这两种类型的GC事件。但需要减少这两种GC事件是,可以通过配置dalvik的系统属性或者修改dalvik的GC算法来实现,本文只对修改dalvik的系统属性的方式进行介绍。

dalvik与GC相关的属性有

dalvik.vm.heapstartsize:初始化dalvik分配的内存大小。

dalvik.vm.heapgrowthlimit:没有在mainfest中设置android:largeheap="true"时,应用的最大内存,超过这个值会有  OOM产生。

dalvik.vm.heapsize:在mainfest中设置android:largeheap="true"时,应用的最大内存,超过这个值会有OOM产生。

dalvik.vm.heaputilization、dalvik.vm.heapminfree 、dalvik.vm.heapmaxfree:dalvik GC时使用的参数。


dalvim GC策略是:

1.在一次GC后,根据当前Heap中已分配的内存大小除以dalvik.vm.heaputilization(0.75),得到一个目标值。

2.如果目标值不在(已分配的值+dalvik.vm.heapminfree)到(已分配的值+dalvik.vm.heapmaxfree)这个区间,即取区间边界值做为目标值(运行一段时间后第1步得到的目标值肯定会超过这个范围)。

3.虚拟机记录这个目标值,当做当前允许总的可以分配到的内存。同时根据目标值减去固定值(200~500K),当做触发GC_CONCURRENT事件的阈值。

4.当下一次分配内存,分配成功时。重新计算已分配的内存大小;若有达到GC_CONCURRENT的阈值,则产生GC。

5.当下一次分配内存,开始分配失败时。则会产生GC_FOR_ALLOC事件,释放内存;然后再尝试分配。

可以通过调整dalvik.vm.heapminfree 和dalvik.vm.heapmaxfree属性的值,减少GC_FOR_ALLOC和GC_CONCURRENT的次数,如果这两个值设置的过大,则会导致一次GC的时间过长,从而会看到明显的卡顿现象,设置的值既要使GC的次数减少,也不能是一次GC的时间过长。

  在有的平台上,可以通过代码对单个应用的dalvik的属性进行设置,以减少对全局设置对系统的影响,可以再App里面通过如下的方式对当前的App的dalvik属性设置:

import dalvik.system.VMRuntime;
import android.os.SystemProperties;
...
VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
VMRuntime.getRuntime().setTargetHeapMinFree(2*1024*1024);
VMRuntime.getRuntime().setTargetHeapConcurrentStart(8*1024*1024);
...

如果想通过系统进行控制,也可以在framework里面的ActivityThread的handleBindApplication函数里面进行设置:

import dalvik.system.VMRuntime;
import android.os.SystemProperties;
import java.lang.*;
...
if( data.processName.equals("com.android.launcher")) {
VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
    VMRuntime.getRuntime().setTargetHeapMinFree(2*1024*1024);
    VMRuntime.getRuntime().setTargetHeapConcurrentStart(8*1024*1024);
}
...


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

与dalvik GC相关的属性详解

在dalvik中,GC的类型有三种: 1、GC_EXPLICIT:     应用主动调用System.gc()产生的GC事件。 2、GC_FOR_ALLOC: ...
  • guggy
  • guggy
  • 2014-08-12 11:08
  • 665

Android 5.0 ART GC 对比 Android 4.x Dalvik GC

为了研究Android虚拟机中的内存管理机制,前期进行了初步调研,下面列出Android 5.0 ART 中GC的更新概要以供参考,资料来源于网络以及对源码的初步阅读。 谷歌在2014年6月26...

Android中Dalvik(DVM)的详解

Android Activity的属性及启动模式相关详解

1、Activity和Task task就好像是能包含很多activity的栈。 默认情况下,一个activity启动另外一个activity时,两个activity是放在同一个task...

Android之TextView组件相关属性详解

android:autoLink 设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all) androi...

Android Activity的属性及启动模式相关详解

1、Activity和Task task就好像是能包含很多activity的栈。 默认情况下,一个activity启动另外一个activity时,两个activity是放在同一个task...

Android View(四)-View相关属性详解

我们在使用View或者在自定义View的时候,可能会遇到AttributeSet,TypedArray,declare-styleable等,那么今天我们就仔细看看这些属性是什么意思。 一.Attri...

Dalvik虚拟机垃圾收集(GC)过程分析

前面我们分析了Dalvik虚拟机堆的创建过程,以及Java对象在堆上的分配过程。这些知识都是理解Dalvik虚拟机垃圾收集过程的基础。垃圾收集是一个复杂的过程,它要将那些不再被引用的对象进行回收。一方...

Dalvik与ART的GC调试

转载自: http://gityuan.com/2015/10/03/Android-GC/ 一、Dalvik 1.1 GC含义 Dalvik虚拟机,每一次GC打印内容格式:...

Dalvik与ART的GC调试

本文主要讲述Dalvik与ART两种Android虚拟机,在GC时产生log信息的含义,便于分析。 一、Dalvik虚拟机 1.1 GC log格式 Dalvik虚拟机,每一次G...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)