广告
返回顶部
首页 > 资讯 > 移动开发 >Android 内存溢出和内存泄漏的问题
  • 494
分享到

Android 内存溢出和内存泄漏的问题

内存溢出内存泄漏Android 2022-06-06 01:06:36 494人浏览 安东尼
摘要

Android 内存溢出和内存泄漏的问题 在面试中,经常有面试官会问“你知道什么是内存溢出?什么是内存泄漏?怎么避免?”通过这篇文章,你可以回答出来了。 内存溢出 (OOM)是

Android 内存溢出和内存泄漏的问题

面试中,经常有面试官会问“你知道什么是内存溢出?什么是内存泄漏?怎么避免?”通过这篇文章,你可以回答出来了。

内存溢出 (OOM)是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如只申请了一个integer,但给它存了long才能存下的数,那就会出现内存溢出。

内存泄露 (memory leak)是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

内存泄漏最终会导致内存溢出。

如何避免内存溢出?

强引用:强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。 当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。

软引用:如果一个对象只具有软引用,但内存空间足够时,垃圾回收器就不会回收它;直到虚拟机报告内存不够时才会回收, 只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。 软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。

弱引用:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间是否足够,都会回收它的内存。 不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。 弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。

虚引用:虚引用可以理解为虚设的引用,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。 虚引用主要用来跟踪对象被垃圾回收器回收的活动。 虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。 当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。 程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。 如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。

1,释放强引用,使用软引用和弱引用;

2,图像处理
大部分的OOM都是发生在图片加载上的,当我们加载大图时,需要特别注意避免OOM的发生。
处理大图片时,不管你的手机内存有多大,如果不对图片进行处理,都有可能会发生内存溢出问题。

1、在内存中压缩图片

装载大图片时需要对图片进行压缩,使用等比例压缩的方法直接在内存中处理图片


Options options = new BitmapFactory.Options(); 
options.inSampleSize = 5; // 原图的五分之一,设置为2则为二分之一 
BitmapFactory.decodeFile(myImage.getAbsolutePath(), options); 

这样做要注意的是,图片质量会变差,inSampleSize设置的值越大,图片质量就越差,不同的手机厂商缩放的比例可能不同。

2、使用完图片后回收图片所占内存

由于Android外层是使用java而底层使用的是C语言在里层为图片对象分配的内存空间。
所以我们的外部虽然看起来释放了,但里层却并不一定完全释放了,我们使用完图片后最好再释放掉里层的内存空间。


if (!bitmapObject.isRecyled()) {   // Bitmap对象没有被回收 
   bitmapObject.recycle();   // 释放 
   System.GC();   // 提醒系统及时回收 
} 

3、降低要显示的图片色彩质量

Android中Bitmap有四种图片色彩模式:

ALPHA_8:每个像素需要占用内存中的1byte
RGB_565:每个像素需要占用内存中的2byte
ARGB_4444:每个像素需要占用内存中的2byte
ARGB_8888:每个像素需要占用内存中的4byte

我们创建Bitmap时,默认的色彩模式是ARGB_8888的,这种色彩模式是质量最高的,当然这样的模式占用的内存也最大。
而ARGB_4444每个像素只占用2byte,所以使用ARGB_4444的模式也能降低图片占用的内存大小。

4、查询图片信息时不把图片加载到内存中

有时候我们取得一张图片,也许只是为了获得这个图片的一些信息,比如图片的width、height等信息,不需要显示到界面上,这个时候我们可以不把图片加载到内存中。


BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inJustDecodeBounds = true; // 不把图片加载到内存中 
Bitmap btimapObject = BitmapFactory.decodeFile(myImage.getAbsolutePath(), options); 

我们不应该把解决OOM的问题寄托在争取最大的内存上,应该通过合理的代码编写来尽可能的规避OOM问题。

如何避免内存泄漏?

1,在 onDestroy()方法中显示调用mThread.close();以此来结束该线程,这就避免了线程的内存泄漏问题。
2,使用application context 代替activity context;
3,资源对象没关闭造成的内存泄漏,如Cursor没有close掉;
4,Bitmap记得recycle掉;
5,构造Adapter时,没有使用缓存的convertView。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

您可能感兴趣的文章:Android Studio 3.0上分析内存泄漏的原因Android中LeakCanary检测内存泄漏的方法Android 5.1 WEBView内存泄漏问题及快速解决方法Android内存泄漏排查利器LeakCanaryAndroid常见的几种内存泄漏小结5个Android开发中比较常见的内存泄漏问题及解决办法Android性能优化之利用Rxlifecycle解决RxJava内存泄漏详解详解Android内存泄漏检测与MAT使用详解Android性能优化之内存泄漏Android开发:浅谈MVP模式应用与内存泄漏问题解决Android Studio+MAT实战内存泄漏


--结束END--

本文标题: Android 内存溢出和内存泄漏的问题

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

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

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

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

下载Word文档
猜你喜欢
  • Android 内存溢出和内存泄漏的问题
    Android 内存溢出和内存泄漏的问题 在面试中,经常有面试官会问“你知道什么是内存溢出?什么是内存泄漏?怎么避免?”通过这篇文章,你可以回答出来了。 内存溢出 (OOM)是...
    99+
    2022-06-06
    内存溢出 内存泄漏 Android
  • android内存溢出和内存泄漏问题怎么解决
    Android内存溢出和内存泄漏是常见的问题,可以通过以下方法来解决:1. 使用内存分析工具:可以使用Android Studio自...
    99+
    2023-08-26
    android
  • android内存溢出和内存泄漏有什么区别
    Android内存溢出和内存泄漏是两个不同的问题。1. 内存溢出(Memory Overflow):内存溢出指的是当应用程序分配的内...
    99+
    2023-08-08
    android
  • JavaScript内存泄漏和内存溢出是什么
    本篇内容主要讲解“JavaScript内存泄漏和内存溢出是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript内存泄漏和内存溢出是什么”吧! ...
    99+
    2022-10-19
  • java中内存泄漏和内存溢出是什么
    内存泄漏(Memory Leak)是指在程序运行过程中,因为不正确的内存管理而导致一部分内存无法被回收的现象。当程序中的对象不再被使...
    99+
    2023-08-25
    java
  • java内存泄漏和内存溢出的原因是什么
    Java内存泄漏和内存溢出的原因如下:1. 内存泄漏:内存泄漏指的是在程序运行过程中,无用的对象仍然被保持在内存中,导致内存占用不断...
    99+
    2023-08-26
    java
  • Java内存溢出和内存泄露的示例分析
    这篇文章给大家分享的是有关Java内存溢出和内存泄露的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、为什么要了解内存泄露和内存溢出?内存泄露一般是代码设计存在缺陷导致的,通过了解内存泄露的场景,可以避...
    99+
    2023-05-30
    java
  • Java基础之内存泄漏与溢出详解
    目录一、浅析二、Java内存泄露三、Java内存溢出一、浅析 内存泄露( memory leak):是指程序在申请内存后,无法释放已申请的内存空间,多次内存泄露堆积后果很严重,内存迟...
    99+
    2022-11-12
  • Android中的内存泄漏
    什么是内存泄漏 长生命周期的对象持有了短生命周期的对象,从而导致短生命周期的对象不能被释放 垃圾回收机制 垃圾回收机制分为:引用计数法、可达性分析法 引用计数法(有循环引用的问...
    99+
    2022-06-06
    内存泄漏 Android
  • android内存泄露的问题
    Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端会出现内存无限制的增长,后系统瘫痪,那么如何快好的检测程序的稳定性,防止系统崩盘,...
    99+
    2022-06-06
    Android
  • Java中出现内存泄漏与溢出如何解决
    这篇文章将为大家详细讲解有关Java中出现内存泄漏与溢出如何解决,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、浅析内存泄露( memory leak):是指程序在申请内存后,无法释放已申...
    99+
    2023-06-15
  • nodeJs内存泄漏问题详解
    之前一次偶然机会发现,react 在server渲染时,当NODE_ENV != production时,会导致内存泄漏。具体issues: https://github.com/facebook/reac...
    99+
    2022-06-04
    详解 内存 nodeJs
  • 浅谈Android应用的内存优化及Handler的内存泄漏问题
    一、Android内存基础 物理内存与进程内存 物理内存即移动设备上的RAM,当启动一个Android程序时,会启动一个Dalvik VM进程,系统会给它分配固定的内存空间(1...
    99+
    2022-06-06
    内存优化 内存泄漏 优化 handler Android
  • 基于ThreadLocal 的用法及内存泄露(内存溢出)
    目录使用构造方法静态方法公共方法内存泄露解决方法为什么要将ThreadLocal 定义成 static 变量对ThreadLocal内存泄漏引起的思考概述使用场景样例代码Thread...
    99+
    2022-11-12
  • android的GC内存泄露问题
    1. android内存泄露概念 不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露。其实如果我们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收...
    99+
    2022-06-06
    Android
  • 怎么解决内存泄漏问题
    本篇内容介绍了“怎么解决内存泄漏问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题排查首先确定内存泄漏问题出现的时间,发现在该时间点的上...
    99+
    2023-06-16
  • 浅析Node.js中的内存泄漏问题
    这篇文章是由Mozilla的Identity团队带来的 A Node.JS Holiday Season系列文章的首篇,该团队上个月发布了 Persona的第一个测试版本。在开发Persona时我们构建了...
    99+
    2022-06-04
    内存 Node js
  • 内存溢出、内存泄露的概述及常见情形
    内存溢出(OutofMemoryError) 简述 java doc 中对 Out Of Memory Error 的解释是,没有空闲内存,并且垃圾收集器也无法提供更多内存。 JVM 提供的内存管理机...
    99+
    2023-09-01
    jvm java 面试 内存泄露 内存溢出
  • android内存及内存溢出分析详解
    一、Android的内存机制    Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通过new...
    99+
    2022-06-06
    内存溢出 Android
  • Android内存泄漏检测-LeakCanary
      前言:   Android内测泄漏是比较常见的问题,在没有造成OOM之前,在测试过程中,也会经常性的忽略这个问题,但在android碎片化严重的,还是存在很多内测泄漏...
    99+
    2022-06-06
    leakcanary android内存泄漏 Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作