关于Java内存回收机制

一、内存泄漏

  1. 什么是内存泄露?
    无用对象持续占有内存或无用对象内存得不到及时的释放,从而造成内存空间的浪费成为内存泄漏。
  2. 易发场景:
    a.静态集合类引起内存泄漏:静态类型集合中的对象已被释放但集合本身仍然存活造成集合占有的内存得不到释放。
    b.集合中对象属性被修改后,调用remove后无效:

     public static void main(String[] args) {
        Set<Person> people = new HashSet<>(3);
        Person p1 = new Person("aaa", 2, "m");
        Person p2 = new Person("bbb", 3, "f");
        Person p3 = new Person("ccc", 5, "f");
    
        people.add(p1);
        people.add(p2);
        people.add(p3);
        System.out.println("共有" + people.size() + "个元素");
    
        p3.setAge(20);
        people.remove(p3);
        people.add(p3);
    
        System.out.println("共有" + people.size() + "个元素");
    
    }

    c.释放对象时未释放监听器。
    d.数据库连接或网络连接等未释放。
    e.单例对象在被初始化后,将在JVM的整个生命周期中存在,如果它持有对外部对象的访问,则外部对象无法所占内存无法被回收。
    f.大的String对象调用split方法后产生多个大型String对象。

  3. 后果:内存被严重消耗,内存溢出。

  4. 查看内存泄露情况:jmap -histo:live [java进程id]。

猜你喜欢

转载自blog.csdn.net/qq_28665631/article/details/80586547
今日推荐