jvm 内存布局笔记

Oracle Hotspot JVM中内存的堆布局是平时接触比较多的。主要分为Young/Old/Perm 三块区域,也就是年轻代/年老代/持久代。

基于分代的垃圾回收算法:思路是把对象按照寿命长短来分组,分为年轻代和年老代,新创建的对象被分配在年轻代,如果对象在经过几次回收后仍然存活,那么就把这个对象划分到年老代。年老代的收集频度不像年轻代那么频繁,这样就减少了每次垃圾收集时所扫描的对象的数量,从而提高垃圾回收效率。
在这里插入图片描述
JVM将整个堆区划分为Young区、Old区、和Perm区,分别存放不同年龄的对象,这三个区存放的对象有如下区别。
Young区又分为Eden区和两个Survivor区,其中所有新创建的对象都在Eden区,当Eden区满之后会触发minor GC 将 Eden区仍然存活的对象赋值到其中一个Survivor区中,另外一个Survivor区中的存活的对象也复制到这个Survivor中,以保证始终有一个Survivor区时空的。
Old区存放的是Young区的Survivor满后触发minor GC 后仍然存活的对象,当Eden区满后会将对象存放到Sruvivor区中,如果Survivor区仍然存不下这些对象,GC收集器就会将这些对象直接存放到Old区。如果这些Survivor区的对象足够老,也直接存放到Old区。如果Old区满了,将会触发Full GC,回收整个堆内存。
Perm区存放的主要是类的Class对象,如果一个类被频繁的加载,也可能会导致Perm区满,Perm区满的垃圾回收也是由Full GC触发的。

猜你喜欢

转载自blog.csdn.net/zhou_blog/article/details/89641523