词条信息

admin
admin
超级管理员
词条创建者 发短消息   

相关词条

热门词条

更多>>
什么是端口?到底是做什么的呢?
端口一般指两种,一种是硬件比如路由器或者交换机的插网线的端口,一种是软件的逻辑的概念,比如http的80端口!...
7种进阶方法让你快速测试端口连通性
Ping是Windows、Linux和Unix系统下的一个检查网络连通性的命令工具,对于大部分互联网用户来说很...
电脑开机,总需要按F1,是什么原因造成的?
一.主板掉电这个说法是行业内的叫法了,一般是主板的CMOS电池没电了导致的。也是最常见的一种提示你按F1的提示...
社保降费对个人有什么影响?
下调城镇职工基本养老保险单位缴费比例是政府给企业发的一个大红包,特别是对于企业来说是一个利好,但是对个人来说有...
车辆“出险”对下年保费的影响,到底有多大?
【出险对交强险的影响】【出险对商业险的影响】车辆“出险”对下年保费的影响,到底有多大?这里有必要先提下车险第三...

精选图集

更多>>
简易百科旧版 >>所属分类 >> Android   

Android性能优化之内存泄露

标签: Android性能优化 内存泄露 Android

顶[0] 发表评论(0) 编辑词条

性能优化目的:

1.如何去优化自己的项目,运行更流畅。

现实App进程分配内存空间: 16M 32M 64M

2..以后开发项目的时候就要从一开始把项目做好

内存泄露

不是所有指令都执行得又快又好,下面介绍内存及它如何影响系统运行。普遍认为,多数程序语言接近硬件或高性能,如C、C++和Fortran,通常程序员会自己管理内存,高手工程师对内存的分配,会慎重处理,并在未来结束使用时再次分配,一旦确认何时及怎样分配内存,内存管理的品质就依赖于工程师的技能跟效率。实际情况是工程师们,不都会去追踪那零碎的内存碎片。程序开发是个混乱又疯狂的过程,内存通常都没办法完全被释放,这些被囚禁的内存叫内存泄露。


内存泄露占用了大量资源,这些资源其实可以更好地使用,为减少泄露引起的混乱、负担、甚至资金损失,便有了内存管理语言。

这些语言在运行时跟踪内存分配,以便当程序不再需要时释放系统内存,完全不用工程师亲自操作,这些内存回收艺术或科学,在内存管理环节下叫垃圾清理。这个设计概念在1959年,当初为了解决lisp语言问题,由John McCarthy发明的。

垃圾清理的基本概念有:

第一,找到未来无法存取的数据,例如所有不受指令操控的内存。

第二,回收被利用过的资源。原理简单,但是两百万行编码,跟4gigs的分配,在实际操作时却非常困难。如果在程序中有20000个对象分配,垃圾清理会让人困惑,哪一个是没用的?或者,何时启动垃圾清理释放内存?这些问题其实很复杂。好在50年来,我们找到了解决问题的方法,就是Android Runtime中的垃圾清理。比McCarthy最初的方法更高级,速度快且是非侵入性的。经由分配类型,及系统如何有效地组织分配以利GC的运行,并作为新的配置。所有影响android runtime的内存堆都被分割到空间中,根据这些特点,哪些数据适合放到什么空间,取决于哪个Android版本。

1.静态的

在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变代码结构(比如可变数组的存在),也不允许有嵌套或者递归结构的出现,因为它们都会导致编译程序无法计算准确的存储空间需求。

2.栈式的

栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。

3.堆式的

堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放.

在C/C++可能需要自己负责释放(java里面直接额依赖GC机制)

栈式和堆式区别:

1.成员变量全部存储在堆中(包括基本数据类型,引用和引用的对象实体) --- 因为它们属于类,类最终还是要被new出来。

2.局部变量的基本数据类型和引用存储于栈当中,引用的对象实体存储于在堆中。-----因为他们属于方法当中的变量,生命周期会随着方法一起结束。

我们所讨论的内存泄漏,主要是讨论堆存储,它存放的是引用指向的对象实体。

有时候确实会有一种情况:当需要的时候可以访问,当不需要的时候可以被回收也可以被暂时保存以备重复使用。

比如:ListView或者GridView、REcyclerView加载大量数据或者图片的时候,

图片非常占用内存,一定要管理好内存,不然很容易内存溢出。

滑出去的图片就回收,节省内存。看ListView的源码----回收对象,还会重用ConvertView。

如果用户反复滑动或者下面还有同样的图片,就会造成多次重复IO(很耗时),

那么需要缓存---平衡好内存大小和IO,算法和一些特殊的java类。

算法:lrucache(最近最少使用先回收)

特殊的java类:利于回收,StrongReference,SoftReference,WeakReference,PhatomReference

StrongReference --- 强引用:

StrongReference 是 Java的默认引用实现, 它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收

回收时机:从不回收 使用:对象的一般保存 生命周期:JVM停止的时候才会终止

SoftReference --- 软引用

SoftReference 于 WeakReference 的特性基本一致, 最大的区别在于 SoftReference 会尽可能长的保留引用直到 JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得 SoftReference 非常适合缓存应用

回收时机:当内存不足的时候;使用:SoftReference<String>结合ReferenceQueue构造有效期短;生命周期:内存不足时终止

WeakReference --- 弱引用

WeakReference 是一个弱引用, 当所引用的对象在 JVM 内不再有强引用时, GC 后 weak reference 将会被自动回

回收时机:在垃圾回收的时候;使用:同软引用; 生命周期:GC后终止

PhatomReference --- 虚引用

“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅>持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用>队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对

象的内存之前,把这个虚引用加入到与之 关联的引用队列中。

ReferenceQueue queue = new ReferenceQueue ();

PhantomReference pr = new PhantomReference (object, queue);

程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

回收时机:在垃圾回收的时候;使用:合ReferenceQueue来跟踪对象被垃圾回收期回收的活动; 生命周期:GC后终止

开发时,为了防止内存溢出,处理一些比较占用内存大并且生命周期长的对象的时候,可以尽量使用软引用和弱引用。软引用比LRU算法更加任性,回收量是比较大的,你无法控制回收哪些对象。

比如使用场景:默认头像、默认图标。

ListView或者GridView、RecyclerView要使用内部缓存+外部缓存(SD卡)

 

 

附件列表


按字母顺序浏览:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

→我们致力于为广大网民解决所遇到的各种电脑技术问题
 如果您认为本词条还有待完善,请 编辑词条

上一篇Android 架构组件之 ViewModel
下一篇Android MVP 架构

0
1. 本站部分内容来自互联网,如有任何版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
2. 本站内容仅供参考,如果您需要解决具体问题,建议您咨询相关领域专业人士。
3. 如果您没有找到需要的百科词条,您可以到百科问答提问或创建词条,等待高手解答。

关于本词条的提问

查看全部/我要提问>>