性能篇(七)内存管理概述

Android运行时ART和Dalvik虚拟机使用分页和内存映射(mmapping)管理内存。这意味着所有被修改过的内存——无论是通过分配新的对象还是触摸被映射的页——仍然驻留在RAM中并且不能移除分页。唯一从应用中释放内存的方法是释放应用持有的对象引用,让内存能够被垃圾收集器使用。但有一个例外:如果系统想在其它地方使用内存,那么所有被映射但没有被修改的文件,比如代码,可能会被从RAM的分页中移除。

本文将阐述Android如何管理应用进程和内存分配。更多关于如何更有效管理应用内存的信息,请查阅【管理应用的内存】。

垃圾收集

一个被管理的内存环境, 像ART或Dalvik虚拟机,保持追踪每一块内存分配。一旦虚拟机确定某块内存不再被程序使用,它会释放该内存回到堆中,而不需要程序员的任何干预。这个在被管理的内存环境中回收不再被使用的内存的机制被称为垃圾收集。垃圾收集有两个目标:找到程序中在未来不会再被访问的数据对象;以及回收被那些对象使用的资源。

Android的内存堆是一个分代的内存堆,这意味着,基于被分配的对象的预期寿命和大小,它追踪着不同的分配群组。例如,最近被分配的对象属于年轻代。当一个对象保持活跃了足够长的时间,它可能会被提升到老年代,后面还有一个永久代。

每一个堆分代都有它自己的对象可以占据的特定的内存数量上限。任何时候某代开始填充时,系统会执行一个垃圾回收事件来尝试释放内存。这个垃圾收集的持续时长取决于它所收集的对象在哪个代,以及在每个代中有多少活跃对象。

虽然垃圾收集可能非常快,但它仍然会影响您应用的性能。通常您无法掌控代码中垃圾收集事件何时会发生。系统有一套正在运行的标准来决定何时执行垃圾收集。当满足标准时,系统会停止执行进程并开始垃圾收集。如果垃圾收集发生在一个密集的正在处理的循环(如动画或音乐回放期间)中间时,这可能会增加处理时间。这个增加可能潜在地推动应用中代码执行时间超过为有效和平滑帧渲染而建议的16ms阈值。

除此之外,您的代码流可能执行某些类型的工作:这类工作强迫垃圾收集事件更频繁地发生或者使它们延续得比平常时间更长。例如,如果在透明度混合动画的每一帧期间,您在一个for循环最里面部分分配多个对象,可能导致大量对象污染内存堆。在那种环境下,垃圾收集器会执行多个垃圾收集事件并会降低应用的性能。

更多关于垃圾收集的分代信息,请查阅【垃圾收集】。

原文地址:https://www.cnblogs.com/andy-songwei/p/10752619.html

时间: 2024-10-19 06:34:42

性能篇(七)内存管理概述的相关文章

内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现

http://blog.csdn.net/pi9nc/article/details/23334659 注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料.此书出版较早,分析的版本为2.4.16,故出现的一些概念可能跟最新版本内核不同.

FreeRTOS高级篇7---FreeRTOS内存管理分析

内存管理对应用程序和操作系统来说都非常重要.现在很多的程序漏洞和运行崩溃都和内存分配使用错误有关.        FreeRTOS操作系统将内核与内存管理分开实现,操作系统内核仅规定了必要的内存管理函数原型,而不关心这些内存管理函数是如何实现的.这样做大有好处,可以增加系统的灵活性:不同的应用场合可以使用不同的内存分配实现,选择对自己更有利的内存管理策略.比如对于安全型的嵌入式系统,通常不允许动态内存分配,那么可以采用非常简单的内存管理策略,一经申请的内存,甚至不允许被释放.在满足设计要求的前提

Linux基础篇之内存管理机制

转载这篇文章之前,先区分下缓存和缓冲的区别, 缓冲和缓存都是RAM中的数据.简单来说,buffer是即将要写入磁盘的数据,而cache是从磁盘中读取数据的.buffer是由各种进程分配的,被用在如输入队列等方面,一个简单的例子如某个进程要求有多个字段读入,在所有字段 被读入完整之前,进程把先前读入的字段放在buffer中保存.cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可以提高系统性能. 1 Linux内存管理的主要特

RDD关键性能考量之 内存管理

<Spark快速大数据分析> 8.4.2 关键性能考量   内存管理 内存对Spark来说哟几个不同的用途,理解并调优Spark的内存使用方法 可以帮助优化Spark应用.在各个执行器进程中,内存有一下所列集中用途. RDD存储 当调用RDD的persist()或cache()方法时,这个RDD的分区会被存储到缓存区中. Spark会根据spark.stroage.memoryFraction限制用来缓存的内存占整个JVM堆空间的比例大小. 如果超出限制,旧的分区数据会被移出内存. 数据混洗与

JVM内存管理------JAVA语言的内存管理概述

引言 内存管理一直是JAVA语言自豪与骄傲的资本,它让JAVA程序员基本上可以彻底忽略与内存管理相关的细节,只专注于业务逻辑.不过世界上不存在十全十美的好事,在带来了便利的同时,也因此引入了很多令人抓狂的内存溢出和泄露的问题. 可怕的事情还不只如此,有些使用其它语言开发的程序员,给JAVA程序员扣上了一个"不懂内存"的帽子,这着实有点让人难以接受.毕竟JAVA当中没有malloc和delete.没有析构函数.没有指针,刚开始接触JAVA的程序员们又怎么可能接触内存这一部分呢,更何况有不

iOS性能优化之内存管理:Analyze、Leaks、Allocations的使用和案例代码 -[转载]

最近研究代码质量检测问题,在网上找的相关资料咱是如下: 一. 一些相关概念 很多人应该比较了解这块内容了...可以权当复习复习... 1.内存空间的划分: 我们知道,一个进程占用的内存空间,包含5种不同的数据区:(1)BSS段:通常是存放未初始化的全局变量:(2)数据段:通常是存放已初始化的全局变量.(3)代码段:通常是存放程序执行代码.(4)堆:通常是用于存放进程运行中被动态分配的内存段,OC对象(所有继承自NSObject的对象)就存放在堆里.(5)栈:由编译器自动分配释放,存放函数的参数值

OC学习篇之---内存管理介绍和使用

在之前的一片文章我们说了OC中谓词操作:http://blog.csdn.net/jiangwei0910410003/article/details/41923507,从今天开始我们就来看一下OC中最难的一部分内容:内存管理 为什么说他难呢?因为内存如果需要我们程序员去管理的话,那个难度肯定是很大的,如果是Java,垃圾回收器会把这份工作给做了,我们不需要关心,但是就是因为如此,Android运行速度上会慢一下,原因很简单,Java的垃圾回收器有很多收集算法的,这个在回收的过程中是很浪费时间的

linux内存管理概述

其中介绍了虚拟内存的机制以及mmap系统调用的实现.mmap允许直接将设备内存映射到用户进程的地址空间中.物理内存的管理,包括缓存的分配及回收,请页机制,交换空间等. 1)交换模块(swap) 这个模块负责控制内存内容的换入换出,它通过替换机制,使得物理内存的页框(RAM页)中保留有效的逻辑页,即从主存中淘汰最近没被访问的逻辑页,保存近来访问过的逻辑页.该模块实现的源程序分别是: page_io.c的主要函数功能是读写交换文件. swap_state.c的主要函数功能是修改交换高速缓存(swap

黑马程序员——OC的内存管理概述

内存管理在Objective-C中的重要性就像指针在C语言中的重要程序一样. 虽然作为一门高级语言,但OC却没有内存回收机制.这就需要开发者来对动态内存进行管理.OC中内存管理的范围是:任何继承了NSObjective的对象,对基本数据类型是无效的.这和它的管理原理有关. 每个对象内部都保存了一个与之关联的整数,称为引用计数器,当使用alloc.new.或copy创建一个对象时,对象的引用计数器被设置为1.给对象发送一条retain信息,可以使引用计数器的值加1,给对象发送一条release信息

OC语言学习 (七) 内存管理

只有对象 才需要内存管理,基本数据型类型不需要. 对象的 release.retain.retainCount方法说明: release 引用计数-1 retain 引用计数+1,返回对象本身. 返回的类型是instancetype retainCount 返回引用计数的数目 当引用计数归0后,会调用对象的 dealloc方法,所以在dealloc中需要释放成员属性对象的引用. 在子类的dealloc方法中,需要释放父类的成员,所以[super dealloc]; retain和release的