说说你对java中GC机制的理解

 

GC负责回收无任何引用对象的内存空间,而不是回收对象本身。

        Java对象内存分配,主要是在Java堆区上的内存分配,采用分代分配机制,GC机制就主要采用分带回收机制。

        对象被创建时,首先分配在年轻代的Eden区(大对象可以直接被创建分配到年老代),大多数对象在被创建不久后就不在使用,因此很快变得不可达,当Eden区满时,执行Minor GC将不可达对象清除,并将剩余的对象复制到一个存活区S0中,此时,另一个存活区S1是空白。

        到下一次Eden区满,在执行一次Minor GC,将Eden区不可达对象清除,将存活对象复制到S1区,并将刚才S0区中不可达对象清除,将此时Eden区存活对象和S0存活对象一并拷贝到S1区。

        当两个幸存区切换几次,达到设定阈值,将任然存活的对象复制到年老区中,此时其实只有很小的一部分。

        年轻代采用算法是“停止-复制算法”。 

        在年轻到经过多次停止-复制法清除不可达对象后,存活的对象都被复制到年老代中,需要更多的内存空间,所以年老代的空间一般比年轻代大,但在老年代发生GC的次数比较少,当年老带内存不足时,执行Major GCFull GC)清除不可达对象,采用“标记-整理算法”,即:标记出仍然存活的对象(存在引用的),将所有存活的对象向一端移动,以保证内存的连续。

        永久代,主要回收两种:常量池中的常量,无用的类信息。常量的回收很简单,没有引用了就可以被回收。对于无用的类进行回收,必须保证三点: 

1)类的所有实例都已经被回收

2)加载类的ClassLoader已经被回收

3)类对象的Class对象没有被引用(即没有通过反射引用该类的地方)

posted @ 2020-10-19 19:12  尘缘01  阅读(163)  评论(0编辑  收藏  举报