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 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为每个应用分配多少内存?如何进行性能调优

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

搭建servlet服务

目录 servlet的生命周期 配置tomcat环境 创建web后端项目 配置web.xml http请求 get和post 其他请求 http响应 Servlet是Server Applet的简称&#xff0c;意思为用Java编写的服务器端的程序&#xff0c;它运行在web服务器中&#xff0c;web服务器负责Servlet和客户的通…

5.利用matlab完成 符号矩阵的转置和 符号方阵的幂运算(matlab程序)

1.简述 Matlab符号运算中的矩阵转置 转置向量或矩阵 B A. B transpose(A) 说明 B A. 返回 A 的非共轭转置&#xff0c;即每个元素的行和列索引都会互换。如果 A 包含复数元素&#xff0c;则 A. 不会影响虚部符号。例如&#xff0c;如果 A(3,2) 是 12i 且 B A.&#xff0…

【PDF密码】PDF文件不能打印,为什么?

正常的PDF文件是可以打印的&#xff0c;如果PDF文件打开之后发现文件不能打印&#xff0c;我们需要先查看一下自己的打印机是否能够正常运行&#xff0c;如果打印机是正常的&#xff0c;我们再查看一下&#xff0c;文件中的打印功能按钮是否是灰色的状态。 如果PDF中的大多数功…

谷粒商城第十天-获取分类属性分组(前端组件抽取父子组件交互)

目录 一、总述 1.1 前端思路 1.2 后端思路 二、前端部分 2.1 将分类树前端代码抽取成一个组件 2.2 使用elementUI的组件实现左右组件功能 2.3 使用事件机制进行组件通信 三、后端部分 四、总结 一、总述 说一下今天需要实现一个什么样子的功能&#xff1a; 很简单&am…

数据结构(c++语言版) 邓俊辉 第五章:二叉树学习笔记

5.1二叉树及其表示 树是由节点和边组成的。 1.有根树 树是由顶点(vertex)和边(edge)组成。树的每个顶点也叫节点(node)。 2.深度与层次 由树的连通性&#xff0c;每一节点与根都有一条路径相连&#xff1a;根据树的无环性&#xff0c;由根通往每个节点的路径必然唯一。 节点v…

数据结构——双向链表

双向链表实质上是在单向链表的基础上加上了一个指针指向后面地址 单向链表请参考http://t.csdn.cn/3Gxk9 物理结构 首先我们看一下两种链表的物理结构 我们可以看到&#xff1a;双向在单向基础上加入了一个指向上一个地址的指针&#xff0c;如此操作我们便可以向数组一样操作…

STM32 4G学习

硬件连接 ATK-IDM750C模块可直接与正点原子 MiniSTM32F103开发板板载的ATK模块接口&#xff08;ATK-MODULE&#xff09;进行连接。 功能说明 ATK-IDM750C是正点原子&#xff08;ALIENTEK&#xff09;团队开发的一款高性能4G Cat1 DTU产品&#xff0c;支持移动4G、联通4G和…

健启星|医学营养的市场先行者

随着《“健康中国2030”规划纲要》、《国民营养计划&#xff08;2017-2030年&#xff09;》等政策的陆续发布&#xff0c;标志着以传统药物治疗为中心的医疗模式时代正式转型到以预防和康复为中心的新的医学营养时代。在此背景下&#xff0c;符合时代需求的特医食品成为“医学营…

vxe table: 实现tree表格,并且自定义展示指定行

要求&#xff0c;数据中必须有唯一的id字段&#xff0c;并且row-config.KeyField 要指定这个id字段。否则在自定义展开行时展开不生效。并不影响tree的渲染 数据有两种形式 普通数据结构tree 状结构&#xff0c; 以树状结构为例: 首先我们要将普通结构的数据&#xff0c;按…

JMeter 的并发设置教程

JMeter 是一个功能强大的性能测试工具&#xff0c;可以模拟许多用户同时访问应用程序的情况。在使用 JMeter 进行性能测试时&#xff0c;设置并发是非常重要的。本文将介绍如何在 JMeter 中设置并发和查看报告。 设置并发 并发是在线程组下的线程属性中设置的。 线程数&#…

CentOS 7 构建 LVS-DR 群集 nginx负载均衡

1、基于 CentOS 7 构建 LVS-DR 群集。 DS&#xff08;Director Server&#xff09;&#xff1a;DIP 192.168.231.132 & VIP 192.168.231.200 [root132 ~]# nmcli c show NAME UUID TYPE DEVICE ens33 c89f4a1a-d61b-4f24-a260…

实现Jenkins自动发包配置

参考抖音&#xff1a;Java不良人 其中的视频演示代码 不推荐把jenkins端口一直开放&#xff0c;推荐使用时候放开&#xff08;版本不太新&#xff0c;避免漏洞攻击&#xff09; [rootVM-4-12-centos soft]# docker-compose -v Docker Compose version v2.19.1docker-compose.…

零基础看懂免费开源的Stable Diffusion

文章目录 前言Diffusion模型推理过程训练过程 Stable Diffusion模型参考 前言 前面一篇文章主要讲了扩散模型的理论基础&#xff0c;还没看过上篇的小伙伴可以点击查看&#xff1a;DDPM理论基础。这篇我们主要讲一下一经推出&#xff0c;就火爆全网的Stable Diffusion模型。St…

策略模式(C++)

定义 定义一系列算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可互相替换((变化)。该模式使得算法可独立手使用它的客户程序稳定)而变化(扩展&#xff0c;子类化)。 ——《设计模式》GoF 使用场景 在软件构建过程中&#xff0c;某些对象使用的算法可能多种多…

神码ai伪原创【php源码】

大家好&#xff0c;小编为大家解答python必备常用英语词汇笔记的问题。很多人还不知道python中常用的英语单词&#xff0c;现在让我们一起来看看吧&#xff01; 火车头采集ai伪原创插件截图&#xff1a; 一.什么是注释 注释是对一段代码的解释&#xff0c;不参与程序运行&…

dubbo之整合SpringBoot

目录 zookeeper安装 1.拉取ZooKeeper镜像 2.新建文件夹 3.挂载本地文件夹并启动服务 4.查看容器 5.进入容器&#xff08;zookeeper&#xff09; Dubbo Admin安装 1.下载dubbo-admin 2.zip包解压 3.修改配置文件 4.打包项目 5.启动jar 6.访问 构建项目 api模块 1.创建…

无涯教程-Perl - getservbyport函数

描述 此功能转换协议PROTO的服务编号PORT,在标量context中返回服务名称,并在列表context中返回名称和相关信息- ($name,$aliases,$port_number,$protocol_name) 该调用基于/etc/services文件返回这些值。 语法 以下是此函数的简单语法- getservbyport PORT, PROTO返回值 …

将vsCode 打开的多个文件分行(栏)排列,实现全部显示,便于切换文件

目录 1. 前言 2. 设置VsCode 多文件分行(栏)排列显示 1. 前言 主流编程IDE几乎都有排列切换选择所要查看的文件功能&#xff0c;如下为Visual Studio 2022的该功能界面&#xff1a; 图 1 图 2 当在Visual Studio 2022打开很多文件时&#xff0c;可以按照图1、图2所示找到自…

伺服系统::编码器

一、主要分类 二、组成与原理 光电编码器 磁编码器&#xff1a;N-->磁感元件&#xff08;0&#xff09;&#xff1b;S-->磁感元件&#xff08;1&#xff09;》脉冲 增量编码器的分辨率、倍频与细分技术 (99 封私信 / 81 条消息) 编码器有什么分类&#xff1f; - 知乎 (z…

安卓:UDP通信

目录 一、介绍 网络通信的三要素&#xff1a; &#xff08;1&#xff09;、IP地址&#xff1a; IPv4: IPv6: IP地址形式&#xff1a; IP常用命令&#xff1a; IP地址操作类: &#xff08;2&#xff09;、端口&#xff1a; &#xff08;3&#xff09;、协议: UDP协…