Android之内存溢出和内存泄漏的原因和解决方案

Android之内存溢出和内存泄漏的原因和解决⽅案
汽油机助力自行车基础
JAVA是在JVM所虚拟出的内存环境中运⾏的,内存分为三个区:堆、栈和⽅法区。
栈(stack):是简单的数据结构,程序运⾏时系统⾃动分配,使⽤完毕后⾃动释放。优点:速度快。
堆(heap):⽤于存放由new创建的对象和数组。在堆中分配的内存,⼀⽅⾯由java虚拟机⾃动垃圾回收器来管理,另⼀⽅⾯还需要程序员提供修养,防⽌内存泄露问题。
⽅法区(method):⼜叫静态区,跟堆⼀样,被所有的线程共享。⽅法区包含所有的class和static变量。
概念
内存溢出(Out of Memory):系统会给每个APP分配内存也就是Heap Size值。当APP占⽤的内存加上我们申请的内存资源超过了Dalvik 虚拟机的最⼤内存时就会抛出的Out Of Memory异常。
墙体切割开门洞
内存泄漏(Memory Leak):当⼀个对象不在使⽤了,本应该被垃圾回收器(JVM)回收。但是这个对象由于被其他正在使⽤的对象所持有,造成⽆法被回收的结果。内存泄漏最终会导致内存溢出。
内存抖动:内存抖动是指在短时间内有⼤量的对象被创建或者被回收的现象,主要是循环中⼤量创建、回收对象。这种情况应当尽量避免。
锁紧螺栓
它们三者的重要等级分别:内存溢出 > 内存泄露 > 内存抖动。
内存溢出对我们的App来说,影响是⾮常⼤的。有可能导致程序闪退,⽆响应等现象,因此,我们⼀定要优先解决OOM的问题。
强引⽤:强引⽤是使⽤最普遍的引⽤。如果⼀个对象具有强引⽤,那垃圾回收器绝不会回收它。 当内存空间不⾜,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终⽌,也不会靠随意回收具有强引⽤的对象来解决内存不⾜的问题。喷雾面膜
软引⽤:如果⼀个对象只具有软引⽤,但内存空间⾜够时,垃圾回收器就不会回收它;直到虚拟机报告内存不够时才会回收, 只要垃圾回收器没有回收它,该对象就可以被程序使⽤。软引⽤可⽤来实现内存敏感的⾼速缓存。 软引⽤可以和⼀个引⽤队列(ReferenceQueue)联合使⽤,如果软引⽤所引⽤的对象被垃圾回收器回收,Java虚拟机就会把这个软引⽤加⼊到与之关联的引⽤队列中。
弱引⽤:只具有弱引⽤的对象拥有更短暂的⽣命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,⼀旦发现了只具有弱引⽤的对象,不管当前内存空间是否⾜够,都会回收它的内存。 不过,
由于垃圾回收器是⼀个优先级很低的线程,因此不⼀定会很快发现那些只具有弱引⽤的对象。 弱引⽤可以和⼀个引⽤队列(ReferenceQueue)联合使⽤,如果弱引⽤所引⽤的对象被垃圾回收,Java虚拟机就会把这个弱引⽤加⼊到与之关联的引⽤队列中。
虚引⽤:虚引⽤可以理解为虚设的引⽤,与其他⼏种引⽤都不同,虚引⽤并不会决定对象的⽣命周期。如果⼀个对象仅持有虚引⽤,那么它就和没有任何引⽤⼀样,在任何时候都可能被垃圾回收器回收。 虚引⽤主要⽤来跟踪对象被垃圾回收器回收的活动。
虚引⽤与软引⽤和弱引⽤的⼀个区别在于:虚引⽤必须和引⽤队列 (ReferenceQueue)联合使⽤。 当垃圾回收器准备回收⼀个对象时,如果发现它还有虚引⽤,就会在回收对象的内存之前,把这个虚引⽤加⼊到与之 关联的引⽤队列中。 程序可以通过判断引⽤队列中是否已经加⼊了虚引⽤,来了解被引⽤的对象是否将要被垃圾回收。 如果程序发现某个虚引⽤已经被加⼊到引⽤队列,那么就可以在所引⽤的对象的内存被回收之前采取必要的⾏动。
关系
内存泄漏是造成应⽤程序OOM的主要原因之⼀。由于Android系统为每个应⽤程序分配的内存有限,当⼀个应⽤中产⽣的内存泄漏⽐较多时,就难免会导致应⽤所需要的内存超过这个系统分配的内存限额,这就造成了内存溢出⽽导致应⽤Crash。胞苷酸
>医疗保健器具

本文发布于:2024-09-24 00:20:01,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/277398.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:内存   回收   对象   垃圾   程序   泄漏   队列
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议