GC是什么(分代收集算法): 1 GC是垃圾回收机制,也是分代收集算法,次数上频繁收集Young区,次数上较少收集Old区,基本不动元空间,JVM在进行GC时,并非每次都堆上面三个内存区域一起回收吗,大部分回收的都是新生代。因此按照回收区域又分为了两种类型,一种是普通GC minorGC一种是全局GC majorGC or FullGC ##

四大GC算法;

1、引用计数法

每个对象都维护了一个引用计数器,每被一次引用就记录一次 缺点: 每次对对象赋值时均要维护引用计数器,而且计数器本身也有一定的消耗; 较难处理循环引用

JVM的实现一般不采用这种方式

2、复制算法

年轻代GC所使用的算法 复制算法引入:

复制算法:

在GC开始的时候,对象只存在与Eden区和名为“From”的Survivor区,Survivor区“To”是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄来决定去向。年龄到达一定值 阈值(默认为15可以通过上面那个Max···参数设置)的对象会被移动到年老区,没有达到阈值的对象会被复制到“To”区。 经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会包正名为To的Survivor区域是空的。Minor GC会一直重复这样的过程。直到“To”区被填满,会将所有的对象移动到老年代。 因为Eden区对象一般存活率较低,一般的,使用两块10%的内存作为空闲和活动区间。而另外80%的内存则是用来给新建对象分配内存的。一但发生GC,将10%的from活动区间与另外80%存货的eden对象转移到10%的to空间区间,接下来将之前的90%的内存完全释放,以此类推。

复制算法缺点: 1 它浪费了一半的内存 2 如果对象的存活率很高,我们可以极端一点,假设存活率是100%,那么我们需要将所有对象都复制一遍,并将所有引用地址重置一遍。复制这一工作所花费的时间在对象存活率达到一定程度时,将会变得不可忽视。所以从以上描述不难看出,复制算法要想使用,最起码对象的存活率要非常低,而且最重要的是,我们要克服50%内存的浪费。

3.标记清除法

适合用于老年代:老年代一般是由标记清除或者是标记清除和标记整理的混合实现 算法分成标记和清除两个阶段,先标记出要回收的对象,然后统一回收这些对象。 当程序运行期间,若可以使用的内存被耗尽的时候,GC线程就会被出发并将程序暂停,随后将要回收的对象标记一遍,最终统一回收这些对象,完成标记清楚工作接下来让程序恢复运行 优点:不需要额外空间 缺点:两次扫描,耗时严重 会产生内存碎片

4.标记压缩法

在整理压缩阶段,不再对标记的对象做回收,而实通过所有存活对象都向一端移动,然后直接清除边界以外的内存。标记的存活对象将会被整理,按照内存地址依次排列,而未被标记的内存会被清理掉。如此一来,当我们需要给新对象分配内存时,jvm只需要持有一个内存的起始地址,这比维护一个空闲列表少了许多开销。 标记整理法不仅可以弥补标记清除法中,内存区域分散的缺点,也消除了复制算法中,内存减半的高额代价

没有最好的算法,只有最合适的算法

分代收集算法