android APP内存优化

news2024/10/5 21:20:11

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 ActivityManager
        val 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.heapgrowthlimit
		val largeMemoryClass = am.largeMemoryClass //对应于 dalvik.vm.heapsize
        Log.i("memInfo", "--------memMax=${memoryMax}, largeMax=${am.largeMemoryClass}")
}

参考资料

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023企业数智化转型的正确打开方式是什么?他这样说(二)

哈喽~又见面了大家&#xff01;上期我们说到了数据在数智化转型中的重要性&#xff0c;戳这里↓↓↓&#xff0c;一键直达 2023企业数智化转型的正确打开方式是什么&#xff1f;他这样说&#xff08;一&#xff09; 这期我们将从监控的角度进一步跟大家分享数智化转型&#x…

微软专家:云计算和 AI下的应用安全挑战和机遇丨直播预告丨IDCF

《冬哥有话说》线上直播上线“研发效能特训营”系列内容。 本系列特训营汇聚了8位来自不同领域具有多年实战经验的专家嘉宾&#xff0c;为您提供研发效能的知识赋能和技能拓展。每月一期&#xff0c;周四晚8点&#xff0c;让大家可以轻松参加并在忙碌的生活中循序渐进的学习。…

Android——超简单的 指纹验证

GT库出指纹验证了&#xff0c;只需 二步即可完成指纹验证功能&#xff0c;非常简单 使用GT库里的&#xff0c;当然需要先依赖好GT库啦: GitHub - 1079374315/GTContribute to 1079374315/GT development by creating an account on GitHub.https://github.com/1079374315/GT …

C++笔记之回调函数的演变

C笔记之回调函数的演变 code review! 文章目录 C笔记之回调函数的演变1.使用函数指针2.使用typedef加函数指针3.使用std::using加函数指针4.使用std::using加std::function5.使用回调和不使用回调对比 1.使用函数指针 代码 #include <iostream>// 定义函数&#xff0c…

浅析数字孪生和虚拟仿真的区别与联系

工业数字孪生和虚拟仿真是当今工业领域的两大热门技术&#xff0c;注意我的说法&#xff0c;在“工业领域”&#xff0c;在其他领域可能概念有所不同。 其实工业数字孪生和虚拟仿真做出来的产品很相似&#xff0c;并且很多数字孪生产品也会结合虚拟仿真技术&#xff0c;所以导致…

最好的和解,是陪“内在小孩”一起长大

“为什么我总是很心累&#xff1f;” 经常莫名感到心累、有深深的无力感&#xff0c;是现代成年人的通病。 生活压力大&#xff0c;忙忙碌碌却觉得迷茫、空虚、压抑&#xff1b; 不管怎么努力&#xff0c;好像总是卡在某个地方&#xff0c;得不到升职加薪&#xff1b; 每段感情…

使用注解实现MyBatis映射

文章目录 前言简单语句用注解增加功能更新功能删除功能查询功能 复杂语句用映射查询功能 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 注解实现的最大的好处是简单SQL语句放注解里&#xff0c;映射文件就不用写了 数据库代码&#xff1a; create t…

轻量级Web框架Flask

Flask-SQLAlchemy MySQL是免费开源软件&#xff0c;大家可以自行搜索其官网&#xff08;https://www.MySQL.com/downloads/&#xff09; 测试MySQL是否安装成功 在所有程序中&#xff0c;找到MySQL→MySQL Server 5.6下面的命令行工具&#xff0c;然后单击输入密码后回车&am…

Scratch 之 TurboWarp 常用插件介绍-2

今天带来2篇 TurboWarp 常用插件介绍 什么你还没有 TurboWarp &#xff1f; 快去下载一个吧 TurboWarp&#xff08;简称TW&#xff09; 在线版 | 离线版下载 TurboWarp优点 编译速度快于原版 Scratch 至少10倍拥有自定义帧的功能&#xff08;比如60 FPS&#xff09;造型编…

【网络基础实战之路】基于三个分公司的内网搭建并连接运营商的实战详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS&#xff1a;本要求基于…

云计算——存储虚拟化简介 与 存储模式及方法

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 前期回顾 前言 一.存储虚拟化介绍 1.云计算存储基本概念 2.云计算存储模型 3.创…

小米基于 Flink 的实时计算资源治理实践

摘要&#xff1a;本文整理自小米高级软件工程师张蛟&#xff0c;在 Flink Forward Asia 2022 生产实践专场的分享。本篇内容主要分为四个部分&#xff1a; 1. 发展现状与规模 2. 框架层治理实践 3. 平台层治理实践 4. 未来规划与展望 Tips&#xff1a;点击「阅读原文」免费领取…

客户端渲染和服务端渲染的区别

一、客户端渲染 页面的渲染工作都是由浏览器来完成的&#xff0c;服务器只是负责提供数据。前端去后端取数据生成DOM树。 **最少两次请求 ** 第一次请求拿到的是页面第二次请求拿到的是动态数据 二、服务端渲染 页面渲染的工作都是由服务端来完成的&#xff0c;数据也是由服…

# X11、Xlib、XFree86、Xorg、GTK、Qt、Gnome和KDE之间的关系

X11、Xlib、XFree86、Xorg、GTK、Qt、Gnome和KDE之间的关系 很多人对于他们是啥是傻傻分不清的&#xff0c;我做了个表格供大家参考。 摘抄&#xff1a; X11是X Window System Protocol, Version 11&#xff08;RFC1013&#xff09;&#xff0c;是X server和X client之间的通…

Maven进阶1 -- 分模块开发、依赖管理、聚合与继承、属性、版本管理、多环境开发、跳过测试

目录 1.分模块开发 将原始模块按照功能拆分成若干个子模块&#xff0c;方便模块间的相互调用&#xff0c;接口共享。 案例&#xff1a;拆分一下这个SSM整合案例 ①创建maven模块 demo项目下的pom.xml文件&#xff08;主要看一下依赖&#xff09; <dependencies><!…

ApplicationContextInitializer

目录 在何处执行&#xff1f;何时初始化&#xff1f;自己写一个ApplicationContextInitializer 那这个类的设计具体有什么作用呢&#xff1f;&#xff1f;1. DelegatingApplicationContextInitializer2. SharedMetadataReaderFactoryContextInitializer3. ContextIdApplication…

试卷扫描去掉痕迹,这个工具很好用

随着科技的不断发展&#xff0c;试卷扫描越来越普及&#xff0c;成为了现代教育不可或缺的一部分。试卷扫描的优势在于可以快速高效地批改试卷&#xff0c;但试卷上的痕迹往往会干扰扫描的准确性。如果可以扫描试卷并将上面填写的答案内容擦除还可以针对打错的题目重新巩固&…

【Rust】Rust学习 第八章常见集合

Rust 标准库中包含一系列被称为 集合&#xff08;collections&#xff09;的非常有用的数据结构。大部分其他数据类型都代表一个特定的值&#xff0c;不过集合可以包含多个值。不同于内建的数组和元组类型&#xff0c;这些集合指向的数据是储存在堆上的&#xff0c;这意味着数据…

mybatis-flex探索

mybatis古今未来 最近无意之中发现了一个非常棒的持久层框架mybatis-flex&#xff0c;迫不及待研究了一下 发现简直就是我的梦中情框&#xff0c;之前写ibatis&#xff0c;后来写mybatis&#xff0c;接着写mybatis-plus&#xff0c;接着研究mybatis-flex ibatis ibatis是apa…

ssm在线医疗服务系统源码和论文PPT

ssm在线医疗服务系统源码和论文PPT003 开发工具&#xff1a;idea 数据库mysql5.7(mysql5.7最佳) 数据库链接工具&#xff1a;navcat,小海豚等 开发技术&#xff1a;java ssm tomcat8.5 选题意义、价值和目标&#xff1a; 随着经济的迅速发展,人们对生活水平和身体健康的要…