关于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. 标记-清除  2. 标记-复制  3. 标记-整理  4. 分代回收  更详细的内容参见深入理解垃圾回收算法: http://blog.csdn.net/dd864140130/article/details/50084471