大白话来说一下JVM内存的分代模型

306 阅读2分钟

这是我参与更文挑战的第4天,活动详情查看: 更文挑战

背景

今天看到一篇讲解JVM内存的分代模型的文章,比较通俗易懂,下面把第一篇中一些关键点摘抄下来。

分代模型

在Java中,采用不同编码方式创建和使用的对象,其对应的生存周期和存储区域是不同的,分代模型如下:

  • 年轻代
  • 老年代
  • 永久代

年轻代

年轻代用来存放创建和使用完之后立马就要回收的对象,即存活周期较短的对象。

public class Test {
    public static void main(String[] args) {
        while(true) {
            func();
        }
    }

    private static void func() {
        Manager manager = new Manager();
        manager.compute();
    }
}

在上面代码中的manager对象就属于短暂存活的对象,每次执行func()方法的时候,被创建出来,然后执行他的compute()方法,接着可能1毫秒之后,就被垃圾回收掉了。

这个manager对象就会被放在年轻代中。

老年代

老年代用来存放在创建之后需要长期存在的对象。

public class Test {
    private static Manager manager = new Manager();

    public static void main(String[] args) {
        while(true) {
            func();
        }
    }

    private static void func() {
        manager.compute();
    }
}

上面代码中定义了一个类静态变量manager,它刚开始的时候是存放在年轻代中,然后才进入老年代中

这个manager实例对象因为会一直被Kafka的静态变量引用的,然后会一直驻留在Java堆内存里,是不会被垃圾回收掉的。

为什么要分成年轻代和老年代?

根本原因是不同生命周期的对象采用不同的垃圾回收机制,所以需要分成两个区域来放不同的对象:

  • 对于年轻代里的对象,他们的特点是创建之后很快就会被回收,所以需要用一种垃圾回收算法
  • 对于老年代里的对象,他们的特点是需要长期存在,所以需要另外一种垃圾回收算法

永久代

JVM里的永久代其实就是之前说的方法区,可以认为永久代就是放一些类信息的。