关于heapsize & heapgrowthlimit

简介: 笔记

Android设备出厂以后,java虚拟机对单个应用的最大内存分配就确定下来了,超出这个值就会OOM。这个属性值是定义在/system/build.prop文件中的


dalvik.vm.heapstartsize


dalvik.vm.heapstartsize=8m它表示堆分配的初始大小,它会影响到整个系统对RAM的使用程度,和第一次使用应用时的流畅程度。它值越小,系统ram消耗越慢,但一些较大应用一开始不够用,需要调用gc和堆调整策略,导致应用反应较慢。它值越大,这个值越大系统ram消耗越快,但是应用更流畅。


dalvik.vm.heapgrowthlimit


dalvik.vm.heapgrowthlimit=64m // 单个应用可用最大内存主要对应的是这个值,它表示单个进程内存被限定在64m,即程序运行过程中实际只能使用64m内存,超出就会报OOM。(仅仅针对dalvik堆,不包括native堆)


dalvik.vm.heapsize


dalvik.vm.heapsize=384m //heapsize参数表示单个进程可用的最大内存,但如果存在heapgrowthlimit参数,则以heapgrowthlimit为准.heapsize表示不受控情况下的极限堆,表示单个虚拟机或单个进程可用的最大内存。而android上的应用是带有独立虚拟机的,也就是每开一个应用就会打开一个独立的虚拟机(这样设计就会在单个程序崩溃的情况下不会导致整个系统的崩溃)。


heapgrowthlimit与heapsize


注意:在设置了heapgrowthlimit的情况下,单个进程可用最大内存为heapgrowthlimit值。在android开发中,如果要使用大堆,需要在manifest中指定android:largeHeap为true,这样dvm heap最大可达heapsize。不同设备,这些个值可以不一样。一般地,厂家针对设备的配置情况都会适当的修改/system/build.prop文件来调高这个值。随着设备硬件性能的不断提升,从最早的16M限制(G1手机)到后来的24m,32m,64m等,都遵循Android框架对每个应用的最小内存大小限制,参考http://source.android.com/compatibility/downloads.html

3.7节。通过代码查看每个进程可用的最大内存,即heapgrowthlimit值:ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);int memClass = activityManager.getMemoryClass();//64,以m为单位


heaptargetutilization


dalvik.vm.heaptargetutilization: 当前理想的堆内存利用率. GC后, Dalvik的Heap内存会进行相应的调整, 调整到当前存活的对象的大小和 / Heap大小 接近这个选项的值, 即这里的0.75. 注意, 这只是一个参考值.


heapminfree


dalvik.vm.heapminfree=512k : 单次Heap内存调整的最小值.


heapmaxfree


dalvik.vm.heapmaxfree=2m : 单次Heap内存调整的最大值.

获取Android手机应用内存大小

手机不同其性能也不同,手机本身内存可能有大有小,所以针对每个应用的内存大小也不相同。

方法一

adb shell  getprop | grep dalvik.vm.heapgrowthlimit  
 [dalvik.vm.heapgrowthlimit]: [64m]

方法二

ActivityManager activityManager =(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);  
activityManager.getMemoryClass();  
activityManager.getLargeMemoryClass();

方法三

adb shell cat /system/build.prop  
dalvik.vm.heapstartsize=8m   
dalvik.vm.heapgrowthlimit=64m   
dalvik.vm.heapsize=256m

方法四

Runtime.getRuntime().maxMemory()

方法五

直接查看build.prop文件

dalvik.vm.heapstartsize=3m
dalvik.vm.heapgrowthlimit=48m
dalvik.vm.heapsize=64m
dalvik.vm.heaptargetutilization=0.75
dalvik.vm.heapminfree=512k
dalvik.vm.heapmaxfree=2m


目录
相关文章
|
6月前
|
JSON 编译器 开发工具
VS Code阅读Android源码
VS Code阅读Android源码
494 1
|
6月前
|
网络协议 测试技术 网络性能优化
Android系统 以太网吞吐量和丢包测试
Android系统 以太网吞吐量和丢包测试
257 1
|
6月前
|
存储 Java Shell
Android系统 实现低内存白名单防LMK原理分析
Android系统 实现低内存白名单防LMK原理分析
370 0
|
6月前
|
存储 物联网 数据库
Android 11 以上 SettingsProvider DatabaseHelper 解析
Android 11 以上 SettingsProvider DatabaseHelper 解析
440 0
|
3月前
|
JavaScript Java 开发工具
Electron V8排查问题之接近堆内存限制的处理如何解决
Electron V8排查问题之接近堆内存限制的处理如何解决
229 1
|
4月前
|
Linux 数据处理 调度
深入探索Linux的renice命令:优化进程优先级
`renice`命令在Linux中用于调整运行进程的优先级,范围-20(最高)至19(最低)。它可以实时改变进程的优先级,无需重启,支持按PID、进程组或用户批量修改。例如,`renice -n 10 -p 1234`将PID为1234的进程优先级设为10。使用时要注意不要滥用高优先级,避免频繁修改,了解系统负载,并记录变更,通常需root权限。
|
6月前
|
存储 Android开发
Android 解决USB TP驱动中触摸卡顿和防抖动问题
Android 解决USB TP驱动中触摸卡顿和防抖动问题
182 1
|
5月前
|
Java API Android开发
19. 【Android教程】进度条 ProgressBar
19. 【Android教程】进度条 ProgressBar
151 4
|
6月前
|
Android开发
Android高级开发面试题以及笞案整理,实战解析
Android高级开发面试题以及笞案整理,实战解析
|
6月前
|
算法 Java Go
Go语言GC:详解GC的五个阶段
【2月更文挑战第20天】
223 0