1.什么是OOM
OOM(内存泄漏)就是说,当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个Error
(这并不是Exception,因为这个问题已经严重到不足以被应用处理,当然Exception也分运行时异常和Checked异常,运行时异常编译可以通过,运行时就会抛出异常,Checked异常编译时必须try-catch到,比如IO操纵等和运行环境有关的而与程序本身无关的一个异常)。
2.为什么会OOM
原因不外乎有两点:
(1)分配的少了
: 比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。
(2)应用用的太多
: 并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。
内存泄露
: 申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了。
内存溢出
: 申请的内存超出了JVM能提供的内存大小,此时称之为溢出。
而在Java语言中,由于存在了垃圾自动回收机制,所以,我们一般不用去主动释放不用的对象所占的内存,也就是理论上来说,是不会存在“内存泄露”的。但是,如果编码不当
,比如,将某个对象的引用放到了全局的Map中,虽然方法结束了,但是由于垃圾回收器会根据对象的引用情况来回收内存,导致该对象不能被及时的回收
。如果该种情况出现次数多了,就会导致内存溢出
,比如系统中经常使用的缓存机制。