首页 > 编程语言 > 详细

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

时间:2020-10-19 21:30:41      阅读:35      评论:0      收藏:0      [点我收藏+]

 

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对象没有被引用(即没有通过反射引用该类的地方)

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

原文:https://www.cnblogs.com/KingAndPig/p/13842121.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!