在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属性设置:

[java] view plaincopy
  1. import dalvik.system.VMRuntime;
  2. import android.os.SystemProperties;
  3. ...
  4. VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
  5. VMRuntime.getRuntime().setTargetHeapMinFree(2*1024*1024);
  6. VMRuntime.getRuntime().setTargetHeapConcurrentStart(8*1024*1024);
  7. ...

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

[java] view plaincopy
  1. import dalvik.system.VMRuntime;
  2. import android.os.SystemProperties;
  3. import java.lang.*;
  4. ...
  5. if( data.processName.equals("com.android.launcher")) {
  6. VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
  7. VMRuntime.getRuntime().setTargetHeapMinFree(2*1024*1024);
  8. VMRuntime.getRuntime().setTargetHeapConcurrentStart(8*1024*1024);
  9. }
  10. ...

Android dalvik GC相关的属性详解相关推荐

  1. Android之drawable state各个属性详解

    我们在定义一个drawable的时候可以通过xml定义的drawable对象.它使得一个图片能在不同的状态下显示不同的图案,比如一个Button,它有pressed,focused,或者其它状态,通过 ...

  2. Android学习笔记5——Button属性详解

    前言 Button组件是在我们在开发中最常用到的组件.Button组件,俗称"按钮",在APP界面当中少不了按钮,那么按钮的属性和使用方法是怎么样的呢? Button常用属性 因为 ...

  3. SAP UI5 DatePicker控件和语言设置相关的属性详解

    In SAP help, the determination of language code / locale is explained. For example, when I access CR ...

  4. Android 开发之EditText属性详解

    EditText & TextView 属性详解: android:layout_gravity="center_vertical" 设置控件显示的位置:默认top. an ...

  5. Android中设置显示文本,Android文本显示控件-TextView属性详解

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

  6. android layout_width 属性,android:layout_weight属性详解

    在android开发中LinearLayout很常用,LinearLayout的内控件的android:layout_weight在某些场景显得非常重要,比如我们需要按比例显示.android并没用提 ...

  7. php中的文字排版问题,CSS布局中常用的文字排版相关属性详解

    本篇文章给大家带来的内容是关于CSS布局中常用的文字排版相关属性详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. CSS布局中常用的文字排版相关属性详解 一.设定文字字体.颜色.大 ...

  8. Android EditText 属性详解

    Android EditText 属性详解 EditText,本文包含大部分开发中用到的属性. Android开发之EditText属性详解 1.EditText输入的文字为密码形式的设置 (1)通过 ...

  9. css动画相关属性详解

    css动画相关属性详解 文章目录 css动画相关属性详解 什么是CSS动画? 一.@keyframes规则 二.延迟动画-animation-delay 三.设置动画应运行多少次animation-i ...

最新文章

  1. Nucleus 实时操作系统中断(下)
  2. Redis进阶实践之三如何在Windows系统上安装安装Redis
  3. [学习笔记] css中的line-height
  4. 查看Windows端口及端口关闭方法
  5. html DOCUMENT
  6. RDD持久化、广播、累加器
  7. 60秒语音有救了?曝微信测试语音进度条,内部人士一句话打回原形
  8. 计算机学院科研,科研概况
  9. 转 Windows串口过滤驱动程序的开发
  10. B/S应用中的ActiveX数字签名相关问题杂谈
  11. flash debug版本
  12. 姿态(Orientation)
  13. 腾达ap设置说明_腾达(Tenda)F3无线信号放大模式(Client+AP)设置 | 192路由网
  14. hexo next auto_excerpt无法使用
  15. 全国计算机缴费时间江苏,2018年3月江苏全国计算机等级考试报名时间
  16. 做个jmeter登陆百度网盘的实例
  17. 8/14 二维高斯函数
  18. centos8 安装mysql8(二)
  19. 卡塔尔世界杯壁纸已上线,下载的壁纸清晰度不够?教你修复清晰
  20. ajax(java)

热门文章

  1. 【转】比较page、request、session、application的使用范围
  2. mysql connector读后记
  3. WindowsXP如何设置共享权限
  4. 使用Owin中间件搭建OAuth2.0认证授权服务器
  5. Tiff – 比较两种字体差异
  6. 3389服务器信息是什么意思,服务器3389端口监控问题
  7. 反序列化对象列表发生异常_面试官:你知道Java对象的序列化与反序列化背后的原理吗?...
  8. 安装mysql查看随机密码命令_centos7/8 yum安装mysql8并查看默认root密码
  9. java图形用户界面实验_java图形用户界面实验教程
  10. linux的python开发环境_linux下python开发环境之一——安装python