Android虚拟机参数说明

ART的比较复杂,这里分析dalvik虚拟的的参数,和art参数的概念是一致的

-xms: 虚拟机堆的起始大小,启动时申请的堆内存大小 prop:dalvik.vm.heapstartsize指定

-xmx: 虚拟机堆使用的虚拟内存最大大小 prop: dalvik.vm.heapsize 指定
-XX:HeapGrowthLimit: 非largeHeap应用最大使用的堆内存 prop: dalvik.vm.heapgrowthlimit
-XX:HeapMinFree 堆最小空闲值,空闲值小于该值时应该扩容堆(调整软限制) prop:dalvik.vm.heapminfree 指定
-XX:HeapMaxFree 堆最大空闲值,大于该值时应该堆缩容(调整软限制) prop: dalvik.vm.heapmaxfree
-XX:HeapTargetUtilization 目标利用率,扩容和缩容的根据目标利用率找到合适的目标堆大小(调整软限制) prop: dalvik.vm.heaptargetutilization
-XX:+DisableExplicitGC 禁止显式gc

首先Android使用mspace系列函数进行内存管理

包括如下几个重要函数

DLMALLOC_EXPORT mspace create_mspace(size_t capacity, int locked) 创建一块连续的虚拟内存
DLMALLOC_EXPORT size_t destroy_mspace(mspace msp) 释放
这两个操作相当于批发一块虚拟内存,其实就是使用系统调用brk申请虚拟内存

DLMALLOC_EXPORT void* mspace_malloc(mspace msp, size_t bytes);
DLMALLOC_EXPORT void mspace_free(mspace msp, void* mem);
这两个函数用于从批发的连续虚拟内存中申请和释放内存,相当于零售操作

DLMALLOC_EXPORT size_t mspace_footprint(mspace msp);
当我们零售内存的时候是把我们批发来的一整款虚拟内存进行分割,为了方便管理以及减少碎片,我们肯定是从最小的内存开始向外零售,

mspace_footprint函数的返回值代表我们现在切割到整块虚拟内存的最大值

size_t mspace_set_footprint_limit(mspace msp, size_t bytes) 这个函数用于管理我们切割整块虚拟内存的行为,当我们调用mspace_malloc去申请内存的时候,mspace_footprint+
bytes是不允许超过mspace_set_footprint_limit设置的footprint_limit的,如果超过了,则直接分配失败,返回NULL

1 android虚拟机就是使用这些函数去管理内存的,首先当虚拟机初始化完成后会创建堆,使用create_mspace创建一块连续虚拟内存,

也就是我们使用的-xmx指定的内存大小(注意这里是虚拟内存,由于操作系统的页面映射机制,这里并没有映射真正的物理内存,

也就是说vss现在是有值的)

2 然后会使用mspace_set_footprint_limit 函数去限制可分配的内存大小。这个值最开始设置成-xms指定的大小。所以我们的堆一开始在申请内存的时候,都会成功,直到第一次超出-xms大小,才会出发gc,或者引起堆的增长

3 那么堆是怎样增长的呢,在分配内存的时候首先会尝试gc,如果gc后还是分配不到的话,就会通过mspace_set_footprint_limit增大可分配大小来扩展堆,这样就可以分配到内存了

4 另外三个参数 -XX:HeapMinFree -XX:HeapMaxFree -XX:HeapTargetUtilization是指导我们对堆进行扩展和收缩的。 在gc的过程中我们会发现堆的空闲内存可能小于-XX:HeapMinFree 或者大于-XX:HeapMaxFree,这时候我们

的堆大小就不合适了,再进行内存分配的话可能浪费内存或者频繁出发gc,所以我们就会进行堆的修剪,指导的参数就是-XX:HeapTargetUtilization,我们需要把堆的大小修剪为-XX:HeapTargetUtilization指定的利用率。那么怎么

计算堆利用率呢? 也就是怎么知道堆的空闲大小?? 就是用mspace_set_footprint_limit减去mspace_footprint,这样就得到了空闲大小。(注意mspace_footprint这个值会在分配对象和释放对象的时候进行加减)

5 再来说说-XX:HeapGrowthLimit, 这个参数在应用没有指定android:largeHeap的时候,该值就是前面说的-xmx指定的最大堆大小,如果设置了android:largeHeap则-xmx使用-xmx指定的堆大小

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值