国培心得体会,敌法师闪来闪去消你魔法,jb军警俱乐部
垃圾收集是java语言的亮点,大大提高了开发人员的效率。
垃圾收集即gc,当内存不足的时候触发,不同的jvm版本算法和机制都有差别。
我是李福春,我在准备面试,今天的问题是:
jvm的垃圾回收算法有哪些?有哪些垃圾收集器?
答:jvm的垃圾回收首先需要标注出可回收的对象,采用的是可达图算法(从对象出发,绘制出出对象的引用关系图,
当从活动对象出发,在图中不可达的对象即可标注为可回收对象)
jvm的垃圾回收算法有3种,列举如下:
1, 标记清除算法。(即把标注的可回收对象直接清理,这样会带来内存碎片化的问题,而且效率不高);
2,标记整理算法。(即把标注的可回收对象清理,在清理的过程中整理内存,解决了内存的碎片化问题);
3,标记复制算法。(把标注的对象清理,没有清理的对象复制到to区,然后互换引用,解决了内存碎片化的问题,但是需要维护对象关系带来一定代价)
垃圾收集器常见的有如下4种,随着jdk的版本迭代在不断增加。列举如下:
1,serialgc , 即单线程垃圾回收,优点是简单,缺点是会引起stop-the-world的问题,是早期版本的垃圾收集器
2,parallelgc,即并行垃圾收集器,(新生代,老年代的收集是并行的),适合吞吐量比较的场景;
3,cmsgc,响应时间优先的垃圾收集器,适合web应用,会带来内存碎片化的问题。
4,g1gc,兼顾响应时间和吞吐量的垃圾收集器,才有分区棋盘的方式进行内存整理,是java8的默认垃圾收集器;
垃圾回收主要集中在两个区域:按照java虚拟机内存模型,即堆区,方法区的元数据区;
堆区垃圾收集过程如下:
1,对象创建后放在堆的新生代的eden区;
2,当内存不足的时候或者周期性的触发minorgc,把没有标记的对象复制到survive区,标记的对象直接回收;
3,jvm的生存周期内不断的循环: 触发minorgc,service区转换为from区,不断的把eden和from区还存在的对象复制到to区,
并进行整理,防止碎片化;把存在周期超过jvm设置的阈值的对象复制到老年代old区;
4,当真个堆区内存不足的时候,触发fullgc,重新整理eden,from,to,old区,一般会造成系统的处理能力急速下降。
元数据区的垃圾回收:主要是当某些类型不再使用的时候,从元数据区卸载。
本篇回答了垃圾回收的标记算法,垃圾回收的算法,常见的垃圾收集器,垃圾回收的过程。
原创不易,转载请注明出处。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
浅析我对 String、StringBuilder、StringBuffer 的理解
使用IDEA搭建SSM框架的详细教程(spring + springMVC +MyBatis)
Springboot整合freemarker 404问题解决方案
引入mybatis-plus报 Invalid bound statement错误问题的解决方法
网友评论