java面试总结01_java垃圾回收机制

面试时被问到这个问题,看网上很多文字,看了都不知道怎么说,我按照自己的想法总结一下,优缺点在网上百度吧:

垃圾回收主要指的是对内存中和方法区的回收,主要有一下方法:

1.引用计数算法

每个对象有一个引用计数器,当一个地方引用该对象时,计数器+1,当该对象的一个引用失效之后,计数器-1。为0时就意为着该对象已不可能再被使用,会被回收!这个是很早的一个算法。

2.标记-清除算法

从根集合扫描,标记存活的对象进行标记,然后在扫描,把未标记的对象清除掉!这个容易造成内存碎片化。

3.复制算法

简单的说就是把一个堆分成对象区和空闲区,当对象区满了,就扫描对象区中活动的对象,并且将这些活动的对象复制到空闲区,然后清理之前的对象区,之前的对象区变成空闲区,之前的空闲区变成了对象区,解决了内存碎片化问题。

4.标记-整理算法

在标记-清除算法基础上,在清除不可用的对象后,将可用的对象往左移动,这样就解决了碎片化问题,但效率低。

5.分代收集算法(重点)

这个算法是现在大部分用的算法。

它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation)新生代可分为eden区和两个survivor区,默认为8:1:1,在堆区之外还有一个代就是永久代(Permanet Generation)。老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法。

新生代minor.gc过程:当eden满了的时候,触发minor.gc,之后,会将任然存活的数据复制到survivor01中,清理eden,再一次触发后,会将存活的对象复制到survivor02中,清理eden和survivor01,经过数次操作任然存活的对象,会复制到老年代中

发布了23 篇原创文章 · 获赞 3 · 访问量 6858

猜你喜欢

转载自blog.csdn.net/weixin_41834814/article/details/82768184
今日推荐