iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >探讨Android内存管理
  • 701
分享到

探讨Android内存管理

Android 2022-06-06 14:06:18 701人浏览 安东尼
摘要

前言 在看这篇文章之前,需要linux内存管理基础,推荐先学习一些Linux内存管理基础知识点,这里我们在做一些应用层的优化工作,但从底层理解一

前言

在看这篇文章之前,需要linux内存管理基础,推荐先学习一些Linux内存管理基础知识点,这里我们在做一些应用层的优化工作,但从底层理解一些原理性的知识点,对我们有较大帮助。

主要讨论四点内容:

Android 内存管理机制 如何评估 App 的内存占用 一些减少 App 内存占用的建议 内存管理概述

Android 运行时 (ART) 和 Dalvik 虚拟机使用分页和内存映射来管理内存。这意味着应用修改的任何内存,无论修改的方式是分配新对象还是轻触内存映射的页面,都会一直驻留在 RAM 中,并且无法换出。要从应用中释放内存,只能释放应用保留的对象引用,使内存可供垃圾回收器回收。这种情况有一个例外:对于任何未经修改的内存映射文件(如代码),如果系统想要在其他位置使用其内存,可将其从 RAM 中换出。

分页

页是一种内存管理技术,它允许进程的物理内存不连续。它通过在称为页面(Page)的相同大小的块中分配内存来消除碎片问题,是目前比较优秀的内存管理技术。分页将物理内存划分为多个大小相等的块,称为帧(Frame)。并将进程的逻辑内存空间也划分为大小相等的块,称为页面(Page),通过页表(Page Table)用于查找此刻存储特定页面的帧,Android 使用的分页稍有不一样的地方

内存映射(binder、thread、内存分配、io

内存映射(mmap)是一种内存映射文件的方法,即将一个文件或者其他对象映射到进程的地址空间,实现文件磁盘地址和应用程序进程虚拟地址空间中一段虚拟地址的一一映射关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上。应用程序处理映射部分如同访问主存。

了解Android内存使用情况

Android内存管理方式,通常,Android设备的内存分为很多页(Page),每页大约4 KB。

Image source: Google I/O 18

图片

Used Pages: 这些是进程当前正在使用的页面. Cached Pages: 进程正在使用的页面,但是内存的某些部分也存在于主内存中。因此,为了快速检索数据,我们使用缓存的页面,是可以被回收的。 **Free Pages:**空闲页

下面看看内存压力对设备的影响。显示了一段时间内的内存使用情况,当 Cached Pages 低于 LMK 阈值时,将会触发低内存杀死机制。

图片

所以,你可以想象 LMK 在低内存手机上的情景:

图片

Linux Kernel 将会持续跟踪每个进程使用的页(Pages),所以只要对进程使用的 Pages 进行统计

图片

有些 Pages 是进程间共享的:

图片

那么问题来了?如何处理此共享内存。是由应用程序负责共享内存,还是由Google Play服务负责此共享内存?有几种不同的方法可用于处理这些情况:

RSS (Resident Set Size): 应用程序负责所有共享内存,使用Google Play服务的应用将负责内存共享。 USS (Unique Shared Set): 应用程序不负责任何共享页面。 **PSS (Proportional Set Size)


--结束END--

本文标题: 探讨Android内存管理

本文链接: https://www.lsjlt.com/news/29776.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 探讨Android内存管理
    前言 在看这篇文章之前,需要Linux内存管理基础,推荐先学习一些Linux内存管理基础知识点,这里我们在做一些应用层的优化工作,但从底层理解一...
    99+
    2022-06-06
    Android
  • 深入探讨JavaScript中的内存管理
    内存管理是编程语言的基本能力,JavaScript 中的内存管理是通过 V8 完成的。V8 的实现遵循 ECMA-262 规范,而规范中没有阐述内存布局以及内存管理相关信息,所以它的原理取决于解释器的实现。唯一肯定的是不管任何编程语言,内存...
    99+
    2023-05-14
    前端 JavaScript
  • C语言动态内存管理深入探讨
    目录1.动态内存开辟的原因2.动态内存函数的介绍2.1malloc和free2.2calloc2.3realloc3.常见的动态内存错误3.1对NULL指针的解引用操作3.2对动态开...
    99+
    2022-11-13
  • 详细探讨gitlab分支删除管理
    随着 GitLab 的普及和广泛使用,越来越多的开发团队在使用它来管理和协调代码的开发和维护。而在 GitLab 中,作为版本控制工具的分支管理也是非常重要的一部分。使用分支管理可以将不同开发任务的代码隔离开来,逐步开发完善后再进行合并,确...
    99+
    2023-10-22
  • Android多线程及异步处理问题详细探讨
    1、问题提出 1)为何需要多线程? 2)多线程如何实现? 3)多线程机制的核心是啥? 4)到底有多少种实现方式? 2、问题分析 1)究其为啥需要多线程的本质就是异步处理,直观一...
    99+
    2022-06-06
    android多线程 异步 线程 Android
  • android内存管理机制是什么
    Android的内存管理机制是一种动态的机制,主要包括以下几个方面:1. 内存分配:Android使用堆来分配内存。堆是一个运行时数...
    99+
    2023-09-13
    android
  • 探讨PHP如何处理文件不存在的情况
    在开发PHP应用程序时,经常需要访问文件系统。有时,您需要检查文件是否存在,并相应地处理它们的存在或不存在。在本文中,我们将探讨PHP如何处理文件不存在的情况。当您使用PHP访问文件系统时,有几种方法可以检查文件是否存在。其中一种方法是使用...
    99+
    2023-05-14
    php
  • 详解android是如何管理内存的
    目录前言Java Heap进程内存分配内存不足管理GC 垃圾回收内核交换守护进程低内存终止守护进程最后前言 很高兴遇见你~ 内存优化一直是 Android 开发中的一个非常重要的话...
    99+
    2022-11-12
  • Aerospike的bin内存管理--即列内存管理
    1、内存申请函数调用 write_master->write_master_dim->write_master_bin_ops ->write_master_bin_ops_l...
    99+
    2022-10-18
  • Android中父View和子view的点击事件处理问题探讨
    android中的事件类型分为按键事件和屏幕触摸事件,Touch事件是屏幕触摸事件的基础事件,有必要对它进行深入的了解。 一个最简单的屏幕触摸动作触发了一系列Touch事件:A...
    99+
    2022-06-06
    view 事件 Android
  • Android内存泄漏导致原因深入探究
    目录什么是内存泄露哪些操作会造成内存泄漏常见内存泄露问题1.资源性对象未关闭2.注册对象未注销3.非静态内部类的静态实例4.单例模式引起的内存泄露5.Handler临时性内存泄露6....
    99+
    2023-02-17
    Android内存泄漏原因 Android内存泄漏几种情况
  • Spark内存管理
    spark的一大特性就是基于内存计算,Driver只保存任务的宏观性的元数据,数据量较小,且在执行过程中基本不变,不做重点分析,而真正的计算任务Task分布在各个Executor中,其中的内存数据量大,且会随着计算的进行会发生实时...
    99+
    2019-06-05
    Spark内存管理
  • Android开发实现的内存管理工具类
    本文实例讲述了Android开发实现的内存管理工具类。分享给大家供大家参考,具体如下:public class MemoryManager { private static final String TAG = "MemoryManage...
    99+
    2023-05-30
    android 内存 工具类
  • 深入探讨Java接口和容器:如何更好地管理文件?
    Java作为一种面向对象编程语言,拥有着非常强大的接口和容器的功能。接口是一种特殊的类,它定义了一组抽象方法,不包含任何实现。容器是一种可以存储多个对象的数据结构,Java中最常用的容器包括List、Set、Map等。在Java中,接口和容...
    99+
    2023-11-04
    接口 容器 文件
  • NPM包管理器:在Git和Go语言中的应用案例探讨
    在现代软件开发中,包管理器是必不可少的工具之一。它们为开发人员提供了快速而简单的方式来获取和管理代码库中的依赖项。本文将重点探讨两种最流行的包管理器:NPM和Git,并介绍它们在Go语言中的应用案例。 NPM包管理器 NPM是最流行的Ja...
    99+
    2023-11-01
    git 分布式 npm
  • JVM内存管理之JAVA语言的内存管理详解
    引言内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑。不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题。可怕的事情还不只...
    99+
    2023-05-31
    jvm 内存管理 java
  • Python的内存管理
        一直以为用Python、java这样的语言就不在需要关心内存使用的问题,但事情还是发生了。     前一段时间需要写一个应用,需要将用户删除的记录在文件中的偏移记录到另一个文件中,由于需要load的最大的数据文件也就1.2...
    99+
    2023-01-31
    内存管理 Python
  • 动态内存管理
    动态内存管理 一.为什么要有动态内存二.malloc和free二.calloc三.realloc 一.为什么要有动态内存 开辟空间的方式有很多种,像是我们经常使用的整形,数组之类的...
    99+
    2023-09-04
    c++ 数据结构 java
  • Android 内存分析(java/native heap内存、虚拟内存、处理器内存 )
    1.jvm 堆内存(dalvik 堆内存) 不同手机中app进程的 jvm 堆内存是不同的,因厂商在出厂设备时会自定义设置其峰值。比如,在Android Studio 创建模拟器时,会设置jvm he...
    99+
    2023-09-14
    java android jvm
  • Python内存管理的原理
    这篇文章主要介绍“Python内存管理的原理”,在日常操作中,相信很多人在Python内存管理的原理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python内存管理的原理”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作