这是我参与更文挑战的第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里的永久代其实就是之前说的方法区,可以认为永久代就是放一些类信息的。