美文网首页
APP内存极限

APP内存极限

作者: 俗人浮生 | 来源:发表于2019-05-31 09:37 被阅读0次

那天在用Profiler进行内存分析时,想到了一个问题:一个手机对每个APP的内存分配极限取决于什么呢?又是如何获取的呢?

老规矩,废话不多说,直接上代码:

        Runtime rt = Runtime.getRuntime();
        long l = rt.maxMemory();//本APP能分配的最大内存
        long l1 = rt.freeMemory();//本APP目前剩余的内存
        long l2 = rt.totalMemory();//本APP目前已分配的内存
        LogUtil.loge("内存maxMemory:"+l);
        LogUtil.loge("内存freeMemory:"+l1);
        LogUtil.loge("内存totalMemory:"+l2);

        ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
        int memoryClass = activityManager.getMemoryClass();//系统为应用分配的内存(无扩充)
        int largeMemoryClass = activityManager.getLargeMemoryClass();//配置AndroidManifest中largeHeap="true"的最大内存
        LogUtil.loge("内存getMemoryClass:"+memoryClass);
        LogUtil.loge("内存getLargeMemoryClass:"+largeMemoryClass);

代码很简单,相关api也都注释清楚了,下面我们分别看看有无配置AndroidManifest中largeHeap="true"打印结果的区别:

//配置AndroidManifest中largeHeap="true"
内存maxMemory:536870912
内存freeMemory:209992
内存totalMemory:9461760
内存getMemoryClass:192
内存getLargeMemoryClass:512
—————————————————————————
//不配置AndroidManifest中largeHeap="true"
内存maxMemory:201326592
内存freeMemory:825464
内存totalMemory:10162176
内存getMemoryClass:192
内存getLargeMemoryClass:512

说明:通过Runtime获取的内存单位的B,通过ActivityManager获取的内存单位是MB
所以,很快我们就发现:

536870912=512*1024*1024
201326592=192*1024*1024

于是我们得出结论:
1)无论是否配置AndroidManifest中largeHeap="true",通过ActivityManager获取的两个参数都是固定不变的
2)当配置AndroidManifest中largeHeap="true"时,通过Runtime获取的maxMemory为getLargeMemoryClass的值
3)当不配置AndroidManifest中largeHeap="true"时,通过Runtime获取的maxMemory为getMemoryClass的值
4)ActivityManager获取的两个参数其实是读取/system/build.prop文件中手机内存的配置参数,请看下图:

模拟器的/system/build.prop

注意红色箭头,其中
dalvik.vm.heapstartsize=初始分配内存
dalvik.vm.heapgrowthlimit=getMemoryClass
dalvik.vm.heapsize=getLargeMemoryClass

以上都是用模拟器测试及查看的结果,下面我们为了让结果更具说服力,拿台手机来验证一下,结果如下:

内存maxMemory:268435456
内存freeMemory:12174780
内存totalMemory:39548880
内存getMemoryClass:128
内存getLargeMemoryClass:256

手机的/system/build.prop

最后,想说明的是,虽然配置AndroidManifest中largeHeap="true"可以为自己的APP分配到更多的内存,但是因为获得更多的内存,GC时间也将花费更多的时间,对性能存在一定的影响,所以,通过内存优化来达到节约内存的目的才是王道啊!

相关文章

  • APP内存极限

    那天在用Profiler进行内存分析时,想到了一个问题:一个手机对每个APP的内存分配极限取决于什么呢?又是如何获...

  • iOS APP内存优化记录

    iOS APP内存优化记录iOS APP内存优化记录

  • android app内存使用限制

    1. app内存限制   Android系统对每个APP有一个逻辑内存限制,就算物理内存富余,如果应用超出APP逻...

  • Android常用检查内存泄漏,过度绘制的工具

    内存溢出(out of memery) 定义:APP运行时占用的内存超出系统分配给该APP的内存,就会出现内存溢出...

  • 小试 Xcode 逆向:App 内存监控原理初探

    小试 Xcode 逆向:App 内存监控原理初探小试 Xcode 逆向:App 内存监控原理初探

  • GC那些事儿--Android内存优化第一弹

    引言 接App优化之内存优化(序), 作为App优化系列中内存优化的一个小部分. 由于内存相关知识比较生涩, 内存...

  • OC内存管理

    什么是 内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发...

  • 内存管理相关

    一.内存 1•移动设备的内存极其有限,每个app所能占用的内存是有限制的 •下列行为都会增加一个app的内存占用Ø...

  • iOS内存管理

    什么是内存管理 移动设备的内存极其有限,每个App所能占用的内存是有限制的。当App所占用的内存较多时,系统会发出...

  • 内存管理篇一 基本概念

    一、基本原理 1. 什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限的 当app所占的内存...

网友评论

      本文标题:APP内存极限

      本文链接:https://www.haomeiwen.com/subject/jhfbtctx.html