OOM:OutOfMemoryError异常

即内存溢出,是指程序在申请内存时,没有足够的空间供其使用,出现了Out Of Memory,也就是要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。

内存溢出分为上溢和下溢,比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢

有时候内存泄露会导致内存溢出,所谓内存泄露(memory leak),是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光,举个例子,就是说系统的篮子(内存)是有限的,而你申请了一个篮子,拿到之后没有归还(忘记还了或是丢了),于是造成一次内存泄漏。在你需要用篮子的时候,又去申请,如此反复,最终系统的篮子无法满足你的需求,最终会由内存泄漏造成内存溢出。

遇到的OOM:

(1)Java Heap 溢出

Java堆用于存储对象实例,我们只要不断的创建对象,而又没有及时回收这些对象(即内存泄漏),就会在对象数量达到最大堆容量限制后产生内存溢出异常。

(2)方法区溢出

方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。

异常信息:java.lang.OutOfMemoryError:PermGen space

方法区溢出也是一种常见的内存溢出异常,一个类如果要被垃圾收集器回收,判定条件是很苛刻的。在经常动态生成大量Class的应用中,要特别注意这点。

SOF:StackOverflow(堆栈溢出)

当应用程序递归太深而发生堆栈溢出时,抛出该错误。因为栈一般默认为1-2m,一旦出现死循环或者是大量的递归调用,在不断的压栈过程中,造成栈容量超过1m而导致溢出。

栈溢出的原因:

    (1)递归调用

    (2)大量循环或死循环

    (3)全局变量是否过多

    (4)数组、List、Map数据过大

OOM在Android开发中出现比较多:

场景有: 加载的图片太多或图片过大时、分配特大的数组、内存相应资源过多没有来不及释放等。

解决方法:

(1)在内存引用上做处理

软引用是主要用于内存敏感的高速缓存。在jvm报告内存不足之前会清除所有的软引用,这样以来gc就有可能收集软可及的对象,可能解决内存吃紧问题,避免内存溢出。什么时候会被收集取决于gc的算法和gc运行时可用内存的大小。

(2)对图片做边界压缩,配合软引用使用

(3)显示的调用GC来回收内存,如:

if(bitmapObject.isRecycled()==false//如果没有回收  

       bitmapObject.recycle();

(4)优化Dalvik虚拟机的堆内存分配

增强程序堆内存的处理效率    

        //在程序onCreate时就可以调用 即可

        privatefinalstaticfloat TARGET_HEAP_UTILIZATION = 0.75f; 

VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);

设置堆内存的大小

privatefinalstaticintCWJ_HEAP_SIZE = 610241024;

      //设置最小heap内存为6MB大小

      VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);

(5)用LruCache 和 AsyncTask<>解决

从cache中去取Bitmap,如果取到Bitmap,就直接把这个Bitmap设置到ImageView上面。
  如果缓存中不存在,那么启动一个task去加载(可能从文件来,也可能从网络)。

Java中内存问题之OOM 和SOF相关推荐

  1. Java中内存溢出和内存泄露详解

    1.内存溢出(OOM) 在程序中导致程序崩溃的两种原因有: ①.空指针.下标越界等异常,这类问题主要原因是因为代码写的有问题 ②.还有一类问题是,代码看着也没有问题,在进行GC时,回收也没有空出足够的 ...

  2. Java中内存中的Heap、Stack与程序运行的关系

    堆和栈的内存管理 栈的内存管理是顺序分配的,而且定长,不存在内存回收问题:而堆 则是随机分配内存,不定长度,存在内存分配和回收的问题: 堆内存和栈内存的区别可以用如下的比喻来看出:使用堆内存就象是自己 ...

  3. 【java】java中内存映射文件和IO

    转载:https://leokongwq.github.io/2017/02/25/java-memorymapped-file-and-io.html 对大多数Java开发人员来说,Java中的内存 ...

  4. 了解Java中的内存泄漏

    来源:SpringForAll社区 1. 简介 Java的核心优势之一是在内置垃圾收集器(简称GC)的帮助下实现自动内存管理.GC隐含地负责分配和释放内存,因此能够处理大多数内存泄漏问题. 虽然GC有 ...

  5. java中的内存泄漏

    ● 请问java中内存泄漏是什么意思?什么场景下会出现内存泄漏的情况? 考察点:内存泄漏 参考回答: Java中的内存泄露,广义并通俗的说,就是:不再会被使用的对象的内存不能被回收,就是内存泄露.如果 ...

  6. Java中的内存泄露的几种可能

    转载自  Java中的内存泄露的几种可能 Java内存泄漏引起的原因: 内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏. 长生命周 ...

  7. Java中关于内存泄漏分析和解决方案,都在这里了!

    作者:李序锴 www.jianshu.com/p/54b5da7c6816 最近正在熟悉Java内存泄漏的相关知识,上网查阅了一些资料,在此做个整理算是对收获的一些总结,希望能对各位有所帮助,有问题可 ...

  8. Java中会存在内存泄漏吗,请简单描述。

    内存泄漏是指不再被使用的对象或者变量一直被占据在内存中. 理论上来说,Java是有GC垃圾回收机制的,也就是说,不再被使用的对象,会被GC自动回收掉,自动从内存中清除. 但是,即使这样,Java也还是 ...

  9. Java中的堆内存、栈内存和方法区总结

    Java中内存分成两种,一种叫做栈内存,一种叫做堆内存.还有一个方法区,也叫做静态区. 1.栈内存中放哪些东西?  ①基本类型的变量,例如int a=3中的a:  ②对象的引用变量,例如Thread ...

最新文章

  1. php时区问题导致php页面显示不正常
  2. 转: 通过Servlet生成验证码图片
  3. [BZOJ] 1634: [Usaco2007 Jan]Protecting the Flowers 护花
  4. 南陵中学2021高考成绩查询,南陵中学2019高考成绩喜报、一本二本上线情况
  5. 关于ExtJS通过单击左边的treePanel在居中的panel加载页面问题
  6. CF1497E1 Square-free division (easy version)
  7. Codeforces Round #673 (Div. 2)——待补 E
  8. 堆排序,为什么升序排列要建大堆,降序排列要建小堆
  9. 得到节点值的两种方法
  10. 如何git-cherry-pick仅更改某些文件?
  11. Django关联数据库时报错TypeError: __init__() missing 1 required positional argument: 'on_delete'...
  12. 2014年java软件project师面试题收集
  13. lucky前面加a还是an_加方法 || 让孩子赶超学霸!这份小学英语知识精编,千万不能错过啦!...
  14. oracle日文编码格式,php – 如何在oracle数据库中正确显示日文字符
  15. pta mysql训练题集 (221-240)
  16. 多线段几何图形—— 简单几何图形(判断一个点是否在图形的内部)
  17. ASP.NET Core MVC 之局部视图(Partial Views)
  18. 数据可视化技术是指运用计算机,计算机图形技术在数据计算方面的应用
  19. 北理计算机实验18,18北理应用统计经验贴
  20. AWS如何安全顺利关闭所有的免费服务

热门文章

  1. 【元胞自动机】基于元胞自动机实现高速公路收费站交通流问题附matlab代码
  2. 如何查看自己电脑开启了哪些端口号
  3. 2022-2028全球与中国锂电池隔膜市场现状及未来发展趋势
  4. uniapp开发中ios底部出现安全距离问题怎么解决?
  5. Briefings in bioinformatics2022 | 基于神经网络的分子性质预测通用优化策略
  6. 解决microk8s 报错error: You must be logged in to the server (Unauthorized)
  7. python读取文件详解_python 文件读取方法详解
  8. Python 学习之 --- 语法部分(变量、标识符、关键字、进制转换、数据类型转换、运算符)
  9. 怎样上android官方下载,【图文教程】如何安装 iOS/Android(安卓)触动精灵?
  10. 软件测试,软件测试练习题