“简单”的内存泄露和溢出

前言

小时候记得印象最喜欢的应该就是小智的卡比兽了。然而不管是金,银仍是其余版本中,卡比兽都好弱啊~~~不过,卡比兽的“内存”是真的大呢,好像永远都不会溢出或者泄漏呢,等等,这什么意思!!html

内存溢出

解释

所谓的内存溢出,从字面上的意思即jvm内存不够用了,目前没法存放建立的对象。java

缘由

  1. JVM分配的内存相对较小,也许是机器的内存原本就小,也能够是jvm参数xmx设置的较小。
  2. 某段代码进行了死循环,致使对象疯狂产生,可是又不会触发GC,因此就内存溢出了。
public void 建立GC的方法(){
    List list = new ArrayList<>();
    while(true){
        Person p1 = new Person(); # p1变量老是指向不一样的对象,应该会Gc
        p1.setAge("23");
        list.add(p1); # 可是list原理是数组,又指向了建立的对象,致使没法GC
    }
}
其实这也能算是一种内存泄漏了。
复制代码
  1. 建立的对象太大,最典型的就是IO了。对象太大致使新生代存放不下,只能存放到老年代。而老年代也存放不下,只能OOM了。

解决(对应上述的解释)

  1. 增大服务器内存,设置xmxxms
  2. 这时候是必定会GC的,经过线程dump和堆dump。分析出现问题的代码
  3. 增大jvm内存,及时关闭流,及时GC。

内存泄露

解释

再也不会被使用的对象不能被回收,就是内存泄露。说的通俗点就是:该对象已经须要被GC了,却没有这么作。数组

缘由

看一段代码:bash

public class Simple {
    Object o1;
    public void method1(){
        o1 = new Object();
        //...其余代码
    }
在Simple的实例没有被回收以前,object对象就不会被回收。缘由就是由于o1是实例变量
复制代码

解决

public class Simple {
    Object o1;
    public void method1(){
        o1 = new Object();
        //...其余代码
        o1 = null
    }
无论是采用引用计数,或者是GC Root判断是否应该GC,当o1 指向 null后,o1这个对象都会被GC
复制代码
public class Simple {
    public void method1(){
        Object o1 = new Object();
        //...其余代码
        o1 = null
    }
o1 的生命周期就只是这个方法了,因此o1这个对象将会被GC。
因此须要记住,设置实例变量时或者类变量 初始化时,想一下GC问题
复制代码

什么是OOM

引用一段话:
OOM,全称Out Of Memory,翻译成中文就是“内存用完了”,来源于java.lang.OutOfMemoryError
看下关于的官方说明: Thrown when the Java Virtual Machine cannot allocate an object because it is out of memory, and no more memory could be made available by the garbage collector.
意思就是说,当JVM由于没有足够的内存来为对象分配空间而且垃圾回收器也已经没有空间可回收时,就会抛出这个error(注:非exception,由于这个问题已经严重到不足以被应用处理)。服务器

结语

内存溢出是必定会产生OOM的。而内存泄漏到达必定程度会致使内存溢出,产生OOM,如上述的list.add()。 参考自:连接markdown

真羡慕卡比兽的肚子啊~~~jvm

相关文章
相关标签/搜索