Java中内存问题之OOM 和SOF
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时就可以调用 即可
private
final
static
float TARGET_HEAP_UTILIZATION =
0
.75f;
VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);
》设置堆内存的大小
private
final
static
int
CWJ_HEAP_SIZE =
6
*
1024
*
1024
;
//设置最小heap内存为6MB大小
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);
(5)用LruCache 和 AsyncTask<>解决
从cache中去取Bitmap,如果取到Bitmap,就直接把这个Bitmap设置到ImageView上面。
如果缓存中不存在,那么启动一个task去加载(可能从文件来,也可能从网络)。
Java中内存问题之OOM 和SOF相关推荐
- Java中内存溢出和内存泄露详解
1.内存溢出(OOM) 在程序中导致程序崩溃的两种原因有: ①.空指针.下标越界等异常,这类问题主要原因是因为代码写的有问题 ②.还有一类问题是,代码看着也没有问题,在进行GC时,回收也没有空出足够的 ...
- Java中内存中的Heap、Stack与程序运行的关系
堆和栈的内存管理 栈的内存管理是顺序分配的,而且定长,不存在内存回收问题:而堆 则是随机分配内存,不定长度,存在内存分配和回收的问题: 堆内存和栈内存的区别可以用如下的比喻来看出:使用堆内存就象是自己 ...
- 【java】java中内存映射文件和IO
转载:https://leokongwq.github.io/2017/02/25/java-memorymapped-file-and-io.html 对大多数Java开发人员来说,Java中的内存 ...
- 了解Java中的内存泄漏
来源:SpringForAll社区 1. 简介 Java的核心优势之一是在内置垃圾收集器(简称GC)的帮助下实现自动内存管理.GC隐含地负责分配和释放内存,因此能够处理大多数内存泄漏问题. 虽然GC有 ...
- java中的内存泄漏
● 请问java中内存泄漏是什么意思?什么场景下会出现内存泄漏的情况? 考察点:内存泄漏 参考回答: Java中的内存泄露,广义并通俗的说,就是:不再会被使用的对象的内存不能被回收,就是内存泄露.如果 ...
- Java中的内存泄露的几种可能
转载自 Java中的内存泄露的几种可能 Java内存泄漏引起的原因: 内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏. 长生命周 ...
- Java中关于内存泄漏分析和解决方案,都在这里了!
作者:李序锴 www.jianshu.com/p/54b5da7c6816 最近正在熟悉Java内存泄漏的相关知识,上网查阅了一些资料,在此做个整理算是对收获的一些总结,希望能对各位有所帮助,有问题可 ...
- Java中会存在内存泄漏吗,请简单描述。
内存泄漏是指不再被使用的对象或者变量一直被占据在内存中. 理论上来说,Java是有GC垃圾回收机制的,也就是说,不再被使用的对象,会被GC自动回收掉,自动从内存中清除. 但是,即使这样,Java也还是 ...
- Java中的堆内存、栈内存和方法区总结
Java中内存分成两种,一种叫做栈内存,一种叫做堆内存.还有一个方法区,也叫做静态区. 1.栈内存中放哪些东西? ①基本类型的变量,例如int a=3中的a: ②对象的引用变量,例如Thread ...
最新文章
- php时区问题导致php页面显示不正常
- 转: 通过Servlet生成验证码图片
- [BZOJ] 1634: [Usaco2007 Jan]Protecting the Flowers 护花
- 南陵中学2021高考成绩查询,南陵中学2019高考成绩喜报、一本二本上线情况
- 关于ExtJS通过单击左边的treePanel在居中的panel加载页面问题
- CF1497E1 Square-free division (easy version)
- Codeforces Round #673 (Div. 2)——待补 E
- 堆排序,为什么升序排列要建大堆,降序排列要建小堆
- 得到节点值的两种方法
- 如何git-cherry-pick仅更改某些文件?
- Django关联数据库时报错TypeError: __init__() missing 1 required positional argument: 'on_delete'...
- 2014年java软件project师面试题收集
- lucky前面加a还是an_加方法 || 让孩子赶超学霸!这份小学英语知识精编,千万不能错过啦!...
- oracle日文编码格式,php – 如何在oracle数据库中正确显示日文字符
- pta mysql训练题集 (221-240)
- 多线段几何图形—— 简单几何图形(判断一个点是否在图形的内部)
- ASP.NET Core MVC 之局部视图(Partial Views)
- 数据可视化技术是指运用计算机,计算机图形技术在数据计算方面的应用
- 北理计算机实验18,18北理应用统计经验贴
- AWS如何安全顺利关闭所有的免费服务
热门文章
- 【元胞自动机】基于元胞自动机实现高速公路收费站交通流问题附matlab代码
- 如何查看自己电脑开启了哪些端口号
- 2022-2028全球与中国锂电池隔膜市场现状及未来发展趋势
- uniapp开发中ios底部出现安全距离问题怎么解决?
- Briefings in bioinformatics2022 | 基于神经网络的分子性质预测通用优化策略
- 解决microk8s 报错error: You must be logged in to the server (Unauthorized)
- python读取文件详解_python 文件读取方法详解
- Python 学习之 --- 语法部分(变量、标识符、关键字、进制转换、数据类型转换、运算符)
- 怎样上android官方下载,【图文教程】如何安装 iOS/Android(安卓)触动精灵?
- 软件测试,软件测试练习题