android APP内存优化

Android为每个应用分配多少内存

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

dalvik.vm.heapstartsize=8m    #起始分配内存
dalvik.vm.heapgrowthlimit=192m #一般情况app申请的最大内存 
dalvik.vm.heapsize=512m   #设置largeheap时,App可用的最大内存dalvik.vm.heaptargetutilization=0.75  #GC相关
dalvik.vm.heapminfree=512k
dalvik.vm.heapmaxfree=8m

以上内存数据的理解如下:

  • 初始内存大小heapstartsize 虚拟机的内存并不是一次就分配完成的,每次应用打开先分配一个初始值,随着后续需要不断扩大内存
  • 单个进程内存限定heapgrowthlimit 表示单个进程内存最大值,超出就会报OOM。(仅仅针对dalvik堆,不包括native堆)
  • 单个虚拟机或单个进程可用的最大内存heapsize 与上面单个进程内存限定区别是,当应用配置为大内存时(manifest配置),可以使用的内存会突破单个进程内存限定,达到最大内存。

配置使用最大内存,在menifest添加配置即可,如下

<application...android:largeHeap="true"...>...
</application>

针对不同手机获取app内存信息,可通过adb命令

$adb shell getprop dalvik.vm.heapstartsize #初始内存大小$adb shell getprop dalvik.vm.heapgrowthlimit #单个进程内存限定$adb shell getprop dalvik.vm.heapsize #最大内存

请添加图片描述
在代码中获取可使用的最大内存

private fun appMemInfo() {val maxMemory = Runtime.getRuntime().maxMemory() //该应用最大占有内存,设置了largeheap该值会变大val freeMemory = Runtime.getRuntime().freeMemory() //空余的内存,该值会变动例如gc操作Log.i("memInfo", "--------memTotal=${maxMemory shr 20}, memFree=${freeMemory shr 20}") //shr 20是转换为M,方便查看
}

注意:dalvik内存,不含nativeHeap.

总结:dalvik内存,不含nativeHeap.单个进程能使用的最大内存为 heapgrowthlimit,
不同厂商和机型可能不一样。通过在Menifest配置largeHeap可以使用更大的内存, 即heapsize值。

系统内存

如果要获取手机的总内存,可以使用如下方法

private fun sysMemInfo() {val am = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManagerval memoryInfo = ActivityManager.MemoryInfo()am.getMemoryInfo(memoryInfo)val availMem = memoryInfo.availMem //系统可用内存val totalMem = memoryInfo.totalMem //系统总内存val threshold = memoryInfo.threshold //低内存阈值,当可用内存小于该值时,系统处于低内存允许val lowMemory = memoryInfo.lowMemory //系统是否低内存运行Log.i("memInfo", "--------availMem=${availMem shr 20}, totalMem=${totalMem shr 20}, threshold=${threshold shr 20}, isLowMem=${lowMemory}")val memoryMax = am.memoryClass //对应于 dalvik.vm.heapgrowthlimitval largeMemoryClass = am.largeMemoryClass //对应于 dalvik.vm.heapsizeLog.i("memInfo", "--------memMax=${memoryMax}, largeMax=${am.largeMemoryClass}")
}

参考资料

Android为每个应用分配多少内存?如何进行性能调优

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/84692.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt在vs中编译出现link2001时,不会生成moc文件了

现象&#xff1a; 解决方法&#xff1a; 在对应头文件-属性-配置属性-常规-项类型-改为Qt Meta-Object Compiler (moc) 即可。 有时候不知道啥原因头文件类型变成普通C头文件

Pyinstaller 打包 django 项目如何将命令行参数加入?

起因 Pyinstaller 打包 django 项目&#xff0c;打包成 manage.exe 后用命令行 cmd manage.exe runserver 0.0.0.0:8001 --noreload 来运行感觉很不方便。 希望能够直接把命令行参数也打包进去&#xff0c;直接运行 exe 。我走了些弯路&#xff0c;但最终实现了。 弯路 我看…

Vue组件的嵌套关系;父组件传递子组件props;子组件传递给父组件$emit;自定义事件;案例

目录 1_Vue组件的嵌套关系1.1_认识组件的嵌套1.2_组件的拆分1.3_组件的通信 2_父组件传递子组件props2.1_父子组件之间通信的方式2.2_父组件传递给子组件2.3_Props的对象用法 3_子组件传递给父组件$emit4_自定义事件(了解)5_小案例6_补充 1_Vue组件的嵌套关系 1.1_认识组件的嵌…

【C++】set 和 map 简单了解使用

文章目录 关联式容器set 和 multisetmap 和 multimap 关联式容器 set 和 multiset map 和 multimap

WebDAV之π-Disk派盘+Joplin

Joplin是一个优秀的开源笔记,可以组织到笔记本中的大量笔记和文本编辑器中进行复制,标记和修改。支持Evernote的笔记直接导入到Joplin应用程序中。Joplin还支持各种云服务同步,包括Dropbox、OneDrive、WebDAV或文件系统,方便对其进行检查、备份和移动。该应用程序可用于Win…

为什么DNS协议运行在UDP之上?

DNS (Domain Name System) 运行在 UDP (User Datagram Protocol) 上主要是出于以下原因&#xff1a; 简单性和效率&#xff1a;UDP 是无连接的&#xff0c;这意味着与建立和维护 TCP 连接相比&#xff0c;UDP 有更少的开销。当 DNS 查询被发送时&#xff0c;它只需要一个小的请…

关于@JSONField的使用

1.此注解来自jar包com.alibaba.fastjson 今天分享一个有意思的事情。这个注解作用与类的属性上&#xff0c;如下&#xff1a; ApiModelProperty(value"开始时间,格式:yyyy-MM-dd",required true) JSONField(name"start_date",ordinal 1) private String…

18 Java并发机制的底层实现原理_volatile实现原理

Java并发机制的底层实现原理_volatile实现原理 Java并发机制的底层实现原理volatile 关键字volatile的两条实现原则&#xff08;Lock前缀的作用&#xff09; Java并发机制的底层实现原理 Java代码在编译后会变成Java字节码&#xff0c;字节码被类加载器加载到JVM里&#xff0c;…

将本地项目上传至gitee的详细步骤

将本地项目上传至gitee的详细步骤 1.在gitee上创建以自己项目名称命名的空项目2.进入想上传的项目的文件夹&#xff0c;然后右键点击3. 初始化本地环境&#xff0c;把该项目变成可被git管理的仓库4.添加该项目下的所有文件5.使用如下命令将文件添加到仓库中去6.将本地代码库与远…

项目实战 — 消息队列(7){虚拟主机设计(1)}

目录 一、什么是虚拟主机 二、编写虚拟主机代码 &#x1f345; 1、准备工作 &#x1f345; 2、实现exchange相关操作 &#x1f384;实现创建交换机exchangeDeclare &#x1f384; 实现 删除交换机exchangeDelete &#x1f345; 3、实现queue相关操作 &#x1f384;实现…

SSL证书DV和OV的区别?

SSL证书是在互联网通信中保护数据传输安全的一种加密工具。它能够确保客户端和服务器之间的通信得以加密&#xff0c;防止第三方窃听或篡改信息。在选择SSL证书时&#xff0c;常见的有DV证书和OV证书&#xff0c;它们在验证标准和信任级别上有所不同。那么SSL证书DV和OV的有哪些…

Linux vi/vim

Linux vi/vim 所有的 Unix Like 系统都会内建 vi 文书编辑器&#xff0c;其他的文书编辑器则不一定会存在。 但是目前我们使用比较多的是 vim 编辑器。 vim 具有程序编辑的能力&#xff0c;可以主动的以字体颜色辨别语法的正确性&#xff0c;方便程序设计。 什么是 vim&…

Mr. Cappuccino的第60杯咖啡——Spring之BeanFactory和ApplicationContext

Spring之BeanFactory和ApplicationContext 类图BeanFactory概述功能项目结构项目代码运行结果总结 ApplicationContext概述功能MessageSource&#xff08;国际化的支持&#xff09;概述项目结构项目代码运行结果 ResourcePatternResolver&#xff08;匹配资源路径&#xff09;概…

面试热题(岛屿数量)

给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该网格的四条边均…

阿里云Nas文件存储的各种场景使用

文章目录 1.ECS服务器挂载NAS文件存储1.1.添加NAS挂载点1.2.为ECS挂载NAS存储image-202202012230314501.3.验证ECS服务器是否挂载了NAS存储1.4.卸载挂载的NAS存储 2.通过命令行的方式在ECS中挂载NAS存储3.KodCloud云盘系统采用NAS存储用户上传的文件3.1.配置云盘系统接入NAS存储…

爬虫013_函数的定义_调用_参数_返回值_局部变量_全局变量---python工作笔记032

然后再来看函数,可以避免重复代码 可以看到定义函数以及调用函数

【MFC】05.MFC第一大机制:程序启动机制-笔记

MFC程序开发所谓是非常简单&#xff0c;但是对于我们逆向人员来说&#xff0c;如果想要逆向MFC程序&#xff0c;那么我们就必须了解它背后的机制&#xff0c;这样我们才能够清晰地逆向出MFC程序&#xff0c;今天这篇文章就来带领大家了解MFC的第一大机制&#xff1a;程序启动机…

Vulhub之Apache HTTPD 换行解析漏洞(CVE-2017-15715)

Apache HTTPD是一款HTTP服务器&#xff0c;它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在一个解析漏洞&#xff0c;在解析PHP时&#xff0c;1.php\x0A将被按照PHP后缀进行解析&#xff0c;导致绕过一些服务器的安全策略。 1、docker-compose build、docker-compo…

Technical debt (技术负债 / 技术债)

Technical debt (技术负债 / 技术债) In software development, or any other IT field (e.g., Infrastructure, Networking, etc.) technical debt (also known as design debt or code debt) is the implied cost of future reworking required when choosing an easy but li…

支持对接鸿蒙系统的无线模块及其常见应用介绍

近距离的无线通信得益于万物互联网的快速发展&#xff0c;基于集成部近距离无线连接&#xff0c;为固定和移动设备建立通信的蓝牙技术也已经广泛应用于汽车领域、工业生产及医疗领域。为协助物联网企业终端产品能快速接入鸿蒙生态系统&#xff0c;SKYLAB联手国产芯片厂家研发推…