• 关于Java面试:GC机制的一些总结


    GC其实是Java 回收的一个机制
    在Java虚拟机中,存在自动内存管理和垃圾清扫机制
    原因:
    电脑的内存大小的不变的,当我们使用对象的时候,如使用New关键字的时候,就会在内存中生产一个对象,但是我们在使用JAVA开发的时候,当一个对象使用完毕之后我们并没有手动的释放那个对象所占用的内存,就这样在使用程序的过程中,对象越来越多,当内存存放不了这么多对象的时候,电脑就会崩溃了,JAVA为了解决这个问题就推出了这个自动清除无用对象的功能,或者叫机制,这就是GC,有个好听是名字叫垃圾回收,其实就在用来帮你擦屁股的,好让你安心写代码,不用管内存释放,对象清理的事情了。
    一:回收时间
    1、系统空闲的时候。
    2、系统自身决定,不可预测的时间/调用System.gc()的时候。
    (说明:此处调用gc方法只是提醒系统可以进行回收了,什么时候回收,还是系统说了算,说白了就是你可以上奏,取决权还是在皇上)
    3、新生代、老年代(可能在加上一个永生代)结构,能提出minor gc/full gc
    内存的分配是发生在新生代中的。当一个对象存活时间足够长的时候,它就会被复制到老年代中。对于不同的世代可以使用不同的垃圾回收算法。(进行世代划分的出发点是对应用中对象存活时间进行研究之后得出的统计规律。一般来说,一个应用中的大部分对象的存活时间都很短。比如局部变量的存活时间就只在方法的执行过程中。基于这一点,对于新生代的垃圾回收算法就可以很有针对性)。

    拓展一下:
    Minor GC ,Full GC 触发条件
    Minor GC触发条件:当Eden区满时,触发Minor GC。
    Full GC触发条件:
    (1)调用System.gc时,系统建议执行Full GC,但是不必然执行
    (2)老年代空间不足
    (3)方法去空间不足
    (4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存
    (5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小。
    参考:https://blog.csdn.net/yhyr_ycy/article/details/52566105

    一个Eden和俩个Survivor区的意义
    如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代
    Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选保证,只有经历16次Minor GC还能在新生代中存活的对象,才会被送到老年代
    (频发的Full GC消耗的时间是非常可观的,会影响大型程序的执行和响应速度)

    附上图片:

    4、说明minor gc/full gc的触发条件、OOM的触发条件,降低GC的调优的策略
    回答:
    eden满了minor gc,升到老年代的对象大于老年代剩余空间full gc,或者小于时被HandlePromotionFailure参数强制full gc;gc与非gc时间耗时超过了GCTimeRatio的限制引发OOM,调优诸如通过NewRatio控制新生代老年代比例,通过MaxTenuringThreshold控制进入老年前生存次数等……能回答道这个阶段就会给我带来比较高的期望了,当然面试的时候正常人都不会记得每个参数的拼写,我自己写这段话的时候也是翻过手册的。回答道这部分的小于2%。(本人表示不鸡道>_<)原文:
    https://blog.csdn.net/zjkC050818/article/details/78376588
    二:对什么东西进行GC
    从GC root搜索不到,而且经过第一次标记、清理后,仍然没有复活的对象。
    (要说清什么是不是用的对象)
    三:目的是什么
    1.删除不使用的对象,腾出内存空间。
    分析:同问题2第一点。40%。

    2.补充一些诸如停止其他线程执行、运行finalize等的说明。
    分析:起码把问题具体化了一些,如果像答案1那样我很难在回答中找到话题继续展开,大约占40%的人。
    补充一点题外话,面试时我最怕遇到的回答就是“这个问题我说不上来,但是遇到的时候我上网搜一下能做出来”。做程序开发确实不是去锻炼茴香豆的“茴”有几种写法,不死记硬背我同意,我不会纠语法、单词,但是多少你说个思路呀,要直接回答一个上网搜,我完全没办法从中获取可以评价应聘者的信息,也很难从回答中继续发掘话题展开讨论。建议大家尽量回答引向自己熟悉的,可讨论的领域,展现给面试官最擅长的一面。

    3.能说出诸如新生代做的是复制清理、from survivor、to survivor是干啥用的、老年代做的是标记清理、标记清理后碎片要不要整理、复制清理和标记清理有有什么优劣势等。
    分析:也是看过《深入JVM虚拟机》的基本都能回答道这个程度,其实到这个程度我已经比较期待了。同样小于10%。

    4.除了3外,还能讲清楚串行、并行(整理/不整理碎片)、CMS等搜集器可作用的年代、特点、优劣势,并且能说明控制/调整收集器选择的方式。
    分析:同上面2个问题的第四点。
    转文:https://blog.csdn.net/zjkC050818/article/details/78376588
    (最后谁的原创找了半天也找不到,以上链接也都是别人转发的>_<)

    回收算法:垃圾回收从理论上非常容易理解,具体的方法有以下几种:
    1. 标记-清除 —Mark-Sweep算法

    标记—清除算法

    初始标记–路径寻址,查找可以回收的路径(和用户线程一起运行)

    并发标记–持续维持已经标记的路径(和用户线程一起运行)

    重新标记–因为并发标记和用户线程一起运行,初始标记可能发生路径变化,所以要确认一遍(和用户线程一起运行)

    并发清除–开始回收垃圾(和用户线程一起运行)

    缺点:

    1、可能会影响用户执行效率

    2、可能产生浮动垃圾(边收集边扔),只能下次回收

    2. 标记-复制 —Copying算法

    它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制 到另外一块上面,然后再把已使用的内存空间一次清理掉,这样一来就不容易出现内存碎片的问题,但是带来的问题就是 内存浪费严重,分配2份用1份
    3. 标记-整理 --Mark-Compact算法

    将数据GC后还会将数据碎片进行排序
    4. 分代回收

    新生代:copying—ParNew

    老生代:Mark----CMS

    更详细的内容参见深入理解垃圾回收算法:
    http://www.cnblogs.com/wjtaigwh/p/6635484.html—他的图画的不错,可以参考一下

  • 相关阅读:
    Python 全栈系列191 基于Redis队列的处理服务
    浅析森林烟火AI检测算法的应用及场景使用说明
    MEV进入比特币,它将改变比特币挖矿?
    CSS基础介绍2
    为了直播焊接,我准备了这些装备
    golang 切片结构体多条件排序
    细说Linux——文件系统管理
    【Python】PyGithub+jinja2 生成Github项目简易海报
    282_WEB_对于注册、数据data_callback中进行处理的理解
    文档管理系统如何为 4 家制造商提供竞争优势
  • 原文地址:https://blog.csdn.net/m0_67391121/article/details/125437863