您当前的位置:首页 > 互联网教程

oom 是什么意思

发布时间:2025-05-20 07:38:34    发布人:远客网络

oom 是什么意思

一、oom 是什么意思

1、OOM Killer(Out of Memory Killer)是当系统内存严重不足时 linux内核采用的杀掉进程,释放内存的机制。

2、OOM Killer通过检查所有正在运行的进程,然后根据自己的算法给每个进程一个 badness分数,拥有最高 badness分数的进程将会在内存不足时被杀掉。

3、某一个进程和它所有的子进程都占用了很多内存的将会打一个高分。

4、为了释放足够的内存来解决这种情况,将杀死最少数量的进程(最好是一个进程)。

5、内核进程和其他较重要的进程会被打成相对较低的分。

6、上面打分的标准意味着,当 OOM killer选择杀死的进程时,将选择一个使用大量内存,有很多子进程且不是系统进程的进程。

7、简单来讲,oom-killer的原则就是损失最小、收益最大,因此它会让杀死的进程数尽可能小、释放的内存尽可能大。在数据库服务器上,MySQL被分配的内存一般不会小,因此容易成为 oom-killer选择的对象。

8、“既然发生了 OOM,那必然是内存不足,内存不足这个问题产生原因很多。

9、首先第一个就是 MySQL自身内存的规划有问题,这就涉及到 mysql相应的配置参数。

10、另一个可以想到的原因就是一般部署 MySQL的服务器,都会部署很多的监控和定时任务脚本,而这些脚本往往缺少必要的内存限制,导致在高峰期的时候占用大量的内存,导致触发 Linux的 oom-killer机制,最终 MySQL无辜躺枪牺牲。”

二、oom码是什么意思

1、oom码,全称“OutOfMemory”,意思是“内存用完了”。

2、它来源于java.lang.OutOfMemoryError。为什么会出现java.lang.OutOfMemoryError的原因是:官方介绍为当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出java.lang.OutOfMemoryError:···(注意:这是个很严重的问题,因为这个问题已经严重到不足以被应用处理)。

三、app运行时发生oom的原因

App使用图片时避免OOM的几种方式:

对于app里使用的大量图片,采用方式:使用时加载,不显示时直接置null或recycle。

这样处理是个好习惯,记本可以杜绝OOM,但是缺憾是代码多了,可能会忘记某些资源recycle。

而有些情况下会出现特定图片反复加载,释放,再加载等,低效率的事情。

4.2简单通过SoftReference引用方式管理图片资源

使用图片时先查询这个hashmap是否有softreference, softreference里的图片是否为空,

如果为空就加载图片到softreference并加入hashmap。

无需再代码里显式的处理图片的回收与释放,gc会自动处理资源的释放。

这种方式处理起来简单实用,能一定程度上避免前一种方法反复加载释放的低效率。但还不够优化。

Android示范程序ImageDownloader.java,使用了一个二级缓存机制。就是有一个数据结构直接持有解码成功的Bitmap对象引用,同时使用一个二级缓存数据结构保持淘汰的Bitmap的softreference对象,由于softreference对象的特殊性,系统会再需要内存的时候首先将softreference持有的对象释放掉,也就是说当vm发现可用的内存较少需要出发gc的时候,二级缓存中的bitmap对象将被回收,而持有一级缓存的bitmap对象用于显示。

其实这个解决方案最为关键的一点是使用了一个比较合适的数据结构,那就是LinkedHashMap类型来进行一级缓存Bitmap的容器。由于LinkeHashMap的特殊性,我们可以控制其内存存储对象的个数并且将不在使用的对象从容器中移除,放到softreference二级缓存里,我们可以在一级缓存中一致保存最近被访问到的bitmap对象,而已经被访问过的图片在LinkedHashMap的容量超过我们预设值时将会把容器中存在的时间最长的对象移除,这个时候我么可以将被移除的LinkedHashMap中的放到二级缓存容器,而二级缓存中的对象管理就交给系统来做了,当系统需要gc时就会首先回收二级缓存容器的Bitmap对象了。

在获取图片对象时候先从一级缓存容器中查找,如果有对应对象并可用直接返回,如果没有的话从二级缓存中查找对应的SoftReference,判断SoftReference对象持有的Bitmap是否可用,可用直接返回,否则返回空。如果二级缓存都找不到图片,那就直接加载图片资源。