与dalvik GC相关的属性详解

单个进程最大内存-修改android中dalvik虚拟机参数 阅读详情

    在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);
}

...








Android GC原理探究(深度好文) 所以当我们尝试手动去生成一些几百K的对象,试图去扩大可用堆大小的时候,反而会导致频繁的GC,因为这些对象的分配会导致GC,而GC后会让堆内存回到合适的比例,而我们使用的局部变量很快会被回收理论上存活对象还是那么多,我们的堆大小也会缩减回来无法达到扩充的目的。这样既能减少拷贝操作,还能减少对内存的需求。主流的大部分Davik采取的都是标注清理(Mark and Sweep)回收算法,也有实现了拷贝GC的,这一点和HotSpot是不一样的,具体使用什么算法是在编译期决定的,无法在运行的时候动态更换。 阅读详情

相关推荐

Android-GC原理探究(深度好文)

1.搭建知识框架可不是说你整理好要学习的知识顺序,然后看一遍理解了能复制粘贴就够了,大多都是需要你自己读懂源码和原理,能自己手写出来的。2.学习的时候你一定要多看多练几遍,把知识才吃透,还要记笔记,这些很重要!最后你达到什么水平取决你消化了多少知识3.最终你的知识框架应该是一个完善的,兼顾广度和深度的技术体系。然后经过多次项目实战积累经验,你才能达到高级架构师的层次。你只需要按照在这个大的框架去填充自己,年薪40W一定不是终点,技术无止境。

2401_83916394的博客 1168

Android 10.0 系统内存优化之修改dalvik虚拟机的内存参数

在10.0的系统开发定制中,app应用也是运行在dalvik虚拟机上的,所以对于一些内存低的系统中,在某些大应用会出现耗内存 卡顿情况,这是系统分配的内存不够大,在进行耗内存的操作,就会出现频繁gc等等原因造成不流畅的现象,接下来就分析下 虚拟机分配内存的相关原理

安卓兼职framework和app工程师的博客 1639

android dalvik heap 管理

最近遇到了一个dalvik memory相关的问题,对dalvik的heap管理部分做了一些了解,在此总结一下,主要是下面3个方面的内容: 1,java heap的实现,和native heap的差异。 2,gc的实现。 3,配置heap的相关prop的含义。 davlik java heap java的heap一般是和Native heap独立开来,因为java对象的回收,

sky的专栏 1865

Android 11.0 系统内存优化之修改dalvik虚拟机的内存参数

在11.0的系统rom开发定制中,app应用也是运行在dalvik虚拟机上的,所以对于一些内存低的系统中,在某些大应用会出现耗内存 卡顿情况,这是系统分配的内存不够大,在进行耗内存的操作,就会出现频繁gc等等原因造成不流畅的现象,接下来就分析下 虚拟机分配内存的相关原理

安卓兼职framework和app工程师的博客 1714

ART堆大小设置及动态调整过程分析(Android 8.1)

ART堆大小设置及动态调整过程分析

QG 3235

Android Go Dalvik虚拟机内存参数heapminfree 修改

Android Go 是google 2017发布的一个专为入门手机设计的Android版本. 是一个简化版本的Android O(及以上)系统,能够在超低端的Android手机上流畅运行. 量化: 硬件上:512RAM至1GB.(Android R不支持512M,并且强烈推荐2GB为Go版本) 软件上:轻量级的安卓系统、Google Go 系列自带应用和Google Play Store(Go版本) 第三方:lite apk Android Go的最大特点是RAM为小内存.那么由此带来的性能问

wende32的博客 3801

Android dalvik GC相关属性详解

dalvik中,GC的类型有三种: 1、GC_EXPLICIT:     应用主动调用System.gc()产生的GC事件。 2、GC_FOR_ALLOC:     内存分配时,发现可用内存不够时触发的GC事件。 3、GC_CONCURRENT:     给java层的class分配内存后,计算已分配的大小达到阈值(当前DVM heap siz

teliduxing1029的专栏 726

android gc分析,android GC浅析

dalvik中,GC的类型有三种:1、GC_EXPLICIT:应用主动调用System.gc()产生的GC事件。2、GC_FOR_ALLOC:3、GC_CONCURRENT:给Java层的class分配内存后,计算已分配的大小达到阈值(当前DVM heap size小一点)时会触发的GC事件。因为第2和第3中GC是由系统触发的,所以应用是无法减少这两种类型的GC事件。但需要减少这两种GC事件是,...

weixin_31626765的博客 447

android 命令行gc,Android Dalvik VM GC options 命令控制参数

} else if (strncmp(argv[i], "-Xgc:", 5) == 0) {//In VM thread, there is a register map for marking each stack item's status whether it is an object or internal value. And In GC step, only object item ...

weixin_30350469的博客 267

Dalvik 和 ART虚拟机

1. Dalvik 虚拟机 Dalvik 虚拟机(Dalvik Virtual Machine),简称 Dalvik VM 或者 DVM。它是 Google 专门为 Android 平台开发的虚拟机,运行在 Android 运行时库中。DVM 并不是一个 Java 虚拟机,原因如下。 1.1 DVM JVM 的区别 DVM 没有遵循 JVM 规范来实现, JVM 主要区别如下: 1. 基于的架构不同 JVM 的执行的指令是基于栈结构,这就意味着需要去栈中读写数据,所需的指令会很多,会导致速度

wangbuji的博客 1714

android 相关的JVM,GC 知识的扩充

1 JVM 是一种规范 java文件-》编译器-》字节码-》机器码 JAVA虚拟机JAVA语言并没有直接联系,他只是特定的二进制文件格式.class文件有所关联, CLASS文件中包含JVM虚拟机指令集(bytecodes)和符号表,还有一些其他辅助信息。 java 编译器指令流 是基于栈的指令集架构,而另一种指令集架构为基于寄存器的指令集架构 2 堆的默认大小 默认空间大小: 初始大小:物理电脑内存大小 / 64 最大内存大小:物理电脑内存大小 / 4 3 Mino...

BonnySoul的博客 398

Android内存机制分析:了解Android堆和栈1、dalvik的Heap和Stack 这里说的只是dalvik java部分的内存,实际上除了dalvik部分,还有native。这个以后

1、dalvik的Heap和Stack这里说的只是dalvik  java部分的内存,实际上除了dalvik部分,还有native。这个以后再说。下面针对上面列出的数据类型进行说明,只有了解了我们申请的数据在哪里,才能更好掌控我们自己的程序。2、对象实例数据实际上是保存对象实例的属性属性的类型和对象本身的类型标记等,但是不保存实例的方法。实例的方法是属于数据指令,是保存在Stack里面,也就是上...

qq_34413557的博客 1453

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

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

@毛宏斌 1万+

Dalvik虚拟机Java堆创建过程分析

使用C/C++开发应用程序最令头痛的问题就是内存管理。慎不留神,要么内存泄漏,要么内存破坏。虚拟机要解决的问题之一就是帮助应用程序自动分配和释放内存。为了达到这个目的,虚拟机在启动的时候向操作系统申请一大块内存当作对象堆。之后当应用程序创建对象时,虚拟机就会在堆上分配合适的内存块。而当对象不再使用时,虚拟机就会将它占用的内存块归还给堆。Dalvik虚拟机也不例外,本文就分析它的Java堆创建过程。

老罗的Android之旅 2万+

Android Dalvik VM GC options 命令控制参数

} else if (strncmp(argv[i], "-Xgc:", 5) == 0) { //In VM thread, there is a register map for marking each stack item's status whether it is an object or internal value. And In GC step, only obje...

PC的€$~!@#% 389
上一篇: Android动态调试程序
下一篇: Android内存的使用
欧军礼
博客等级 码龄17年 198粉丝 54原创
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值