zoukankan      html  css  js  c++  java
  • 面试刷题25:jvm的垃圾收集算法?

    image.png

    垃圾收集是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区,一般会造成系统的处理能力急速下降。

    元数据区的垃圾回收:主要是当某些类型不再使用的时候,从元数据区卸载。

    小结

    本篇回答了垃圾回收的标记算法,垃圾回收的算法,常见的垃圾收集器,垃圾回收的过程。

    image.png

    原创不易,转载请注明出处。

  • 相关阅读:
    Django 07模型层—单表操作(增删改查)
    Django 05(模板-变量、过滤器、 标签 )
    Django 04(url与views相关内容)
    路由基础及反向解析
    Django项目基础
    Django框架导读
    异常处理
    Docker
    Docker基本概念
    Docker架构
  • 原文地址:https://www.cnblogs.com/snidget/p/12611730.html
Copyright © 2011-2022 走看看