JVM004聊聊JVM分代模型:年轻代、老年代、永久代,你的对象在JVM内存中如何分配?如何流转?
1. 大部分对象都是存活周期极短的
一旦方法结束,那么方法的栈帧就会出栈,一旦没人引用这个对象了,就会被JVM的垃圾回收线程给回收掉,释放内存空间
2.少数对象是长期存活的 类的静态对象就是
3.JVM 分代模型:年轻代和老年代
JVM将Java堆内存划分为两个区域,一个年轻代,一个是老年代
4.什么是永久代
很简单,JVM里的永久代其实就是我们之前说的方法区。其实所谓的永久代,你可以认为永久代就是存放一些类信息的。
5. 大部分正常对象都优先在新生代分配内存
一旦方法执行完毕之后,这个方法的栈帧出栈,会导致没有任何局部变量引用那个实例对象了。那么此时就一定会发生垃圾回收,
去回收掉Java堆内存里那个没人使用的实例对象吗?【NO】大家别想的那么简单了,实际上垃圾回收他也得有点触发条件的。
其实一个比较常见的场景可能是这样的,假设我们写的代码中创建了N多对象,然后导致Java堆内存里囤积了大量的对象。然后这些对象
都是之前有人引用,比如各种各样的方法中的局部变量,但是现在也都没人引用了。这个时候,如果新生代我们预先分配的内存空间,
几乎都被全部对象给占满了!此时假设我们代码继续运行,他需要在新生代里去分配一个对象,怎么办?发现新生代里内存空间都不够了!
这个时候,就会触发一次新生代内存空间的垃圾回收,信贷内存空间的垃圾回收,也称之为“Minor GC”,有的时候我们也叫Young GC,
他会尝试把新生代里那些没人引用的垃圾对象,都给回收掉。我们在代码中创建的大部分对象,其实都是这种使用之后立马就可以回收掉的
生存周期极短的对象。可能我们会在新生代里分配大量的对象,但是使用完之后立马就没人引用了,此时新生代差不多满了,然后要分配
新的对象的时候,发现新生代内存空间不足,就会触发一次垃圾回收,然后就把所有垃圾对象给干掉,腾出大量的内存空间。
6.长期存活的对象会躲过多次来及回收
类的静态变量引用的实例对象 它确实一直会存活在新生代里。因为他被类的静态变量给引用了,所以他不会被回收。那么此时JVM就有一条规定了
【如果一个实例对象在新生代中,成功的在15垃圾回收之后,还是没有被回收掉,就说明它已经15岁了】
这是对象的年龄,每垃圾回收一次,如果一个对象没有被回收掉,他的年龄就会增加1。
对象在新生代中成功躲过10多次垃圾回收,成为一个老年人,那么就会被认为是会长期存活在内存里的对象。然后他会被转移到
Java堆内存的老年代中去,顾名思义,老年代就是放这些年龄很大的对象。
7.老年代会被垃圾回收吗?
答案是肯定的,因为老年代里的对象也有可能随着的代码的运行,不再被任何人引用,就需要被垃圾回收。
在对象分配这块,还要很多其他的复杂机制,比如
新生代垃圾回收之后,因为存活对象太多,导致大量对象直接进入老年代
特别大的超大对象直接不经过新生代就进入老年代
动态对象年龄判断机制
空间担保机制
先理解一下几点
对象优先分配在新生代
新生代如果对象满了,会触发MinorGC回收掉没有人引用的垃圾对象
如果有对象躲过了十多次垃圾回收,就会放入老年代里
如果老年代也满了,那么也会触发来及回收,把老年代理没人引用的垃圾对象清理掉

浙公网安备 33010602011771号