聊聊App在安卓设备中所使用的内存

文章用来记录及分享本人对安卓程序中内存使用的个人见解,如有不同见解 不吝赐教。

先简单浏览下面代码,看看对它们是否熟悉👇

               val activityManager = getSystemService(ACTIVITY_SERVICE) as ActivityManager// Java 堆内存信息val runtime = Runtime.getRuntime()val usedMemory = (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024val maxMemory = runtime.maxMemory() / 1024 / 1024//todo Native内存和Java(Dalvik/ART)内存是分开的val memoryInfo = ActivityManager.MemoryInfo()activityManager.getMemoryInfo(memoryInfo)// 获取系统内存信息// 获取应用最大可使用内存,标准模式和大内存模式//应用在Dalvik/ART虚拟机中可以分配的最大内存。val memoryClassMb = activityManager.memoryClass//用于那些需要更多内存的应用,表示在大内存设备上应用可以使用的内存预算。val largeMemoryClassMb = activityManager.largeMemoryClass//系统总内存val totalMemoryMb = memoryInfo.totalMem / 1024 / 1024//系统可用内存val availMemoryMb = memoryInfo.availMem / 1024 / 1024//系统已用内存val usedMemoryMb = totalMemoryMb - availMemoryMbval lowMemory = memoryInfo.lowMemoryLog.d(TAG, "系统总内存: $totalMemoryMb MB \n" +"系统可用内存: $availMemoryMb MB\n" +"系统已用内存: $usedMemoryMb MB\n" +"应用最大可使用内存 (标准模式): ${memoryClassMb}MB\n" +"应用最大可使用内存 (大内存模式): ${largeMemoryClassMb}MB")val debugMemoryInfo : Debug.MemoryInfo = Debug.MemoryInfo()Debug.getMemoryInfo(debugMemoryInfo)//当前程序的总内存使用量(以 MB 为单位)(包括 Java 堆、Native 堆以及其他内存使用,整个进程的总内存使用)val totalPssMb = debugMemoryInfo.totalPss.toLong() / 1024// 当前进程在 native 层可用的总堆内存大小(以 MB 为单位)val nativeHeapSize: Long = Debug.getNativeHeapSize() / 1024 / 1024//当进程中native层中已使用堆内存(以 MB 为单位)val useNative : Long = Debug.getNativeHeapAllocatedSize() / 1024 / 1024//当前进程中native层中剩余的堆内存(以 MB 为单位)val freeNative = Debug.getNativeHeapFreeSize() / 1024 / 1024// 计算当前应用剩余可用的内存val maxMemoryClassMb = if (largeMemoryClassMb > memoryClassMb) largeMemoryClassMb else memoryClassMbval remainingMemoryMb = maxMemoryClassMb - totalPssMb// 检查是否接近内存上限val isMemoryLow = usedMemory > maxMemory * 0.8 || useNative > nativeHeapSize * 0.8 || lowMemory

在开发安卓应用时,内存管理一直是一个关键的考虑因素。良好的内存管理不仅可以提高应用的性能,还能避免内存泄漏和崩溃,由于项目所需,特来恶补相关知识。

1. Java 堆内存

Java 堆内存是 JVM 分配给应用的内存,主要用于分配对象。通过 Runtime.getRuntime() 可以获取和管理 JVM 的堆内存信息。

val runtime = Runtime.getRuntime()
val usedMemory = (runtime.totalMemory() - runtime.freeMemory()) / 1024 / 1024
val maxMemory = runtime.maxMemory() / 1024 / 1024
  • 已用内存(usedMemory):当前应用已经使用的堆内存。
  • 最大内存(maxMemory):JVM 能够使用的最大内存。

注意事项

  • 避免内存泄漏:确保不再使用的对象能及时被垃圾回收,避免持有不必要的引用。
  • 合理分配内存:尽量减少大对象的使用,优化数据结构以节省内存。

2. 系统内存

系统内存是整个设备的内存,包括所有运行的应用和系统服务。通过 ActivityManager可以获取设备的系统内存信息。

val memoryInfo = ActivityManager.MemoryInfo()
activityManager.getMemoryInfo(memoryInfo)val totalMemoryMb = memoryInfo.totalMem / 1024 / 1024
val availMemoryMb = memoryInfo.availMem / 1024 / 1024
val usedMemoryMb = totalMemoryMb - availMemoryMb
val lowMemory = memoryInfo.lowMemory
  • 系统总内存(totalMemoryMb):设备的总内存。
  • 系统可用内存(availMemoryMb):设备当前可用的内存。
  • 系统已用内存(usedMemoryMb):设备当前已使用的内存。
  • 低内存标志(lowMemory):系统是否处于低内存状态。

注意事项

  • 在低内存状态下,系统可能会回收后台应用的内存以确保前台应用正常运行。开发者应适当释放资源,避免应用被系统强制终止。

3. 应用内存配额

安卓系统对每个应用分配了内存配额,标准模式和大内存模式下的内存配额有所不同。

val memoryClassMb = activityManager.memoryClass
val largeMemoryClassMb = activityManager.largeMemoryClass
  • 标准模式内存配额(memoryClassMb):应用在标准模式下最大可使用的内存。
  • 大内存模式内存配额(largeMemoryClassMb):应用在大内存模式下最大可使用的内存。

注意事项

  • 合理选择内存模式:对于需要大量内存的应用,可以申请大内存模式,但要确保设备支持。

4. 进程内存信息

通过 Debug.MemoryInfo 可以获取当前进程的内存使用情况,包括 Java 堆、Native 堆以及其他类型的内存使用。

val debugMemoryInfo : Debug.MemoryInfo = Debug.MemoryInfo()
Debug.getMemoryInfo(debugMemoryInfo)val totalPssMb = debugMemoryInfo.totalPss.toLong() / 1024
  • 总 PSS 内存(totalPssMb):当前应用进程的总内存使用量,一般程序使用内存情况就看这个数据。

5. Native 层内存

除了 Java 堆,应用还会使用 Native 层的内存。通过 Debug 类可以获取 Native 堆内存信息。

val nativeHeapSize: Long = Debug.getNativeHeapSize() / 1024 / 1024
val useNative : Long = Debug.getNativeHeapAllocatedSize() / 1024 / 1024
val freeNative = Debug.getNativeHeapFreeSize() / 1024 / 1024
  • Native 堆大小(nativeHeapSize):当前进程在 Native 层可用的总堆内存。
  • 已使用的 Native 内存(useNative):当前进程中 Native 层已使用的堆内存。
  • 剩余的 Native 内存(freeNative):当前进程中 Native 层剩余的堆内存。

注意事项

  • 避免 Native 内存泄漏:使用 C/C++ 编写的代码要特别注意内存管理,确保分配的内存在使用后能及时释放。

先写到这,后续深入了解后再继续补充
下班,端午快乐~

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

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

相关文章

adb 脚本化Android系统截图和录屏

1、首先我们了解截图和录屏最基础的命令 手机录屏 adb shell screenrecord sdcard/Pictures/Screenshots/Record_xxx.mp4导出手机录屏 adb pull sdcard/Pictures/Screenshots/Record_xxx.mp4手机截屏 adb shell screencap /sdcard/Screenshots_xxx.png导出手机截屏 adb pu…

应用层——HTTP协议(自己实现一个http协议)——客户端(浏览器)的请求做反序列化和请求分析,然后创建http向响应结构

应用层:之前我们写的创建套接字,发送数据,序列化反序列化这些都是在写应用层 我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层 之前的网络计算机是我们自定义的协议:传输的数据最终是什么样的结…

Gnu/Linux 系统编程 - 如何获取帮助及一个演示

Gnu/Linux 系统编程 - 如何获取帮助及一个演示 今天开始写 Gnu/Linux 环境下的系统编程,主要的用的语言是 C,主要是为了学习 C 语言,边学边写,这样的学习速度是比较快的。 今天就先介绍下如何在手头上没有任何资料的情况下&…

windows11搭建 stable-diffusion-webui

2024年5月22日23:46:57 建议电脑配置 电脑配置: Intel Core™ Ultra 5 125H 1.20 GHz 32.0 GB (31.6 GB 可用) 系统:windows11 注意:最好挂上外网,或者设置好访问github的dns,不然很可能失败 1,安装 An…

高级文件操作

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 Python内置的os模块除了可以对目录进行操作,还可以对文件进行一些高级操作,具体函数如表4所示。 表4 os模块提供的与文件相…

vue3 项目目录使用文件夹和index.vue,与直接用直接用名字.vue的区别

在 Vue 3 项目中,使用文件夹加 index.vue 文件与直接使用组件名字命名的 .vue 文件都是常见的组织方式。两者各有优缺点,适用于不同的场景和需求。以下是对这两种方式的详细比较: 使用文件夹和 index.vue 文件 结构示例 src/ ├── compo…

【AI基础】第三步:纯天然保姆喂饭级-安装并运行chatglm2-6b

chatglm2构建时使用了RUST,所以在安装chatglm2之前,先安装RUST。 此系列文章列表: 【AI基础】第一步:安装python开发环境-windows篇_下载安装ai环境python-CSDN博客 【AI基础】第一步:安装python开发环境-conda篇_mini…

知识图谱的应用---智慧司法

文章目录 智慧司法典型应用 智慧司法 智慧司法是综合运用人工智能、大数据、互联网、物联网、云计算等信息技术手段,遵循司法公开、公平、公正的原则,与司法领域业务知识经验深度融合,使司法机关在审判、检查、侦查、监管职能各方面得到全面的…

Android14 WMS-Power键短按流程

目录 1. PhoneWindowManager#interceptKeyBeforeQueueing 2. PhoneWindowManager#handleKeyGesture 3. PhoneWindowManager#handleCameraGesture 4. SingleKeyGestureDetector#interceptKey 5. SingleKeyGestureDetector#interceptKeyUp 6. SingleKeyGestureDetector#Ke…

【数据结构】图论入门

引入 数据的逻辑结构: 集合:数据元素间除“同属于一个集合”外,无其他关系线性结构:一个对多个,例如:线性表、栈、队列树形结构:一个对多个,例如:树图形结构&#xff1…

「前端+鸿蒙」鸿蒙应用开发-搭建开发环境创建项目

快速体验鸿蒙应用开发,首先需要搭建开发环境和创建项目。 搭建开发环境 下载DevEco Studio: 访问华为开发者联盟官方网站下载DevEco Studio。DevEco Studio下载链接 安装DevEco Studio: 运行下载的安装程序,按照安装向导指引完成…

SpringBoot中的WebMvcConfigurationSupport和WebMvcConfigurer

在SpringBoot中可以通过以下两种方式来完成自定义WebMvc的配置: (1)继承WebMvcConfigurationSupport类 (2)实现WebMvcConfigurer接口 通过这两种方式完成的WebMvc配置存在差异,本文将对此作简单说明与区…

【Vue】单页应用程序介绍

通常基于Vue去开发一整个网站,开发出来的这整个网站应用,我们都会叫做单页应用程序 概念 单页应用程序:SPA【Single Page Application】是指所有的功能都在一个html页面上实现 我们可以将页面共用的部分封装成组件,底下要切换的也…

【copy_dwg_files.bat】

参考这段代码,实现copy_dwg_files的功能 好的,以下是参考你提供的代码来实现 copy_dwg_files.bat 的功能。这段代码将在当前目录及其所有子目录中查找 施工图 文件夹,并将该文件夹下的所有 .dwg 文件复制到同一目录下的 Calculate 文件夹中。如果 Calculate 文件夹不存在,…

工具-金舟投屏软件: 手机如何投屏到电脑上 / Wi-Fi / USB

金舟安卓/iOS苹果投屏-正版软件下载中心 方法一、金舟投屏软件-wifi 1.1、准备工作 确保苹果手机和Windows电脑都连接到同一个Wi-Fi网络。 在Windows电脑上安装并打开金舟投屏软件。 1.2、操作步骤 在金舟投屏软件上选择“苹果手机投屏”功能。 在苹果手机上下滑屏幕&am…

New Work-flow of Circuit Bootstrapping

参考文献: [CGGI17] Chillotti I, Gama N, Georgieva M, et al. Faster packed homomorphic operations and efficient circuit bootstrapping for TFHE. ASIACRYPT 2017 (1): 377-408.[CDKS21] Chen H, Dai W, Kim M, et al. Efficient homomorphic conversion be…

dots_image 增强图像中的圆点特征

dots_image 增强图像中的圆点特征 1. dot_image 有什么用途?2. 点状字符的特征增强3. Halcon代码 1. dot_image 有什么用途? Enhance circular dots in an image. 这个算子可以增强图像中的圆点特征,例如下面的例子。 2. 点状字符的特征增强…

忆恒创源国产系列新品 —— PBlaze7 7A40 取得 PCI-SIG 兼容性认证

在此前报道中,我们曾预告了忆恒创源国产系列 PCIe 5.0 SSD 新品 —— PBlaze7 7A40,今天,这款 SSD 已经顺利通过 PCI-SIG 的严格测试并出现在 Integrators List 集成商列表当中,标志着距离 PBlaze7 7A40 的正式发布又近了一步。 正…

记录汇川:红绿灯与HMI-ST

项目要求: 子程序: 子程序: 实际动作如下: 红绿灯与HMI-ST

网工内推 | 华为生态合作伙伴企业,IP以上认证优先,最高20k+

01 金华威(华为生态合作伙伴) 🔷招聘岗位:网络工程师 🔷职责描述: 1、负责华为数通产品线用户需求规划、选型、设计、报价及方案制定工作; 2、负责华为数通产品线项目投标文件的编写及应答&a…