文档章节

你能不能谈谈,Java GC是在什么时候,对什么东西,做了什么事情?

Hosee
 Hosee
发布于 2016/05/12 21:36
字数 1526
阅读 3.2K
收藏 27
GC

3 月,跳不动了?>>>

地球人都知道,Java有个东西叫垃圾收集器,它让创建的对象不需要像c/cpp那样delete、free掉,你能不能谈谈,GC是在什么时候,对什么东西,做了什么事情?
一.回答:什么时候?
1.系统空闲的时候。
    分析:这种回答大约占30%,遇到的话一般我就会准备转向别的话题,譬如算法、譬如SSH看看能否发掘一些他擅长的其他方面。
2.系统自身决定,不可预测的时间/调用System.gc()的时候。
    分析:这种回答大约占55%,大部分应届生都能回答到这个答案,起码不能算错误是吧,后续应当细分一下到底是语言表述导致答案太笼统,还是本身就只有这样一个模糊的认识。
3.能说出新生代、老年代结构,能提出minor gc/full gc
    分析:到了这个层次,基本上能说对GC运作有概念上的了解,譬如看过《深入JVM虚拟机》之类的。这部分不足10%。
4.能说明minor gc/full gc的触发条件、OOM的触发条件,降低GC的调优的策略。

    full gc的触发条件请查看什么时候会发生FullGC
    分析:列举一些我期望的回答:eden满了minor gc,升到老年代的对象大于老年代剩余空间full gc,或者小于时被HandlePromotionFailure参数强制full gc;gc与非gc时间耗时超过了GCTimeRatio(GC时间占总时间的比率,默认值为99,即允许1%的GC时间,仅在使用Parallel Scavenge收集器时生效)的限制引发OOM,调优诸如通过NewRatio控制新生代老年代比例,通过MaxTenuringThreshold控制进入老年前生存次数等……能回答道这个阶段就会给我带来比较高的期望了,当然面试的时候正常人都不会记得每个参数的拼写,我自己写这段话的时候也是翻过手册的。回答道这部分的小于2%。
总结:程序员不能具体控制时间,系统在不可预测的时间调用System.gc()函数的时候;当然可以通过调优,用NewRatio控制newObject和oldObject的比例,用MaxTenuringThreshold 控制进入oldObject的次数,使得oldObject 存储空间延迟达到full gc,从而使得计时器引发gc时间延迟OOM的时间延迟,以延长对象生存期。

二.回答:对什么东西

   1.不使用的对象。
    分析:相当于没有回答,问题就是在问什么对象才是“不使用的对象”。大约占30%。
 2.超出作用域的对象/引用计数为空的对象。
    分析:这2个回答站了60%,相当高的比例,估计学校教java的时候老师就是这样教的。第一个回答没有解决我的疑问,gc到底怎么判断哪些对象在不在作用域的?至于引用计数来判断对象是否可收集的,我可以会补充一个下面这个例子让面试者分析一下obj1、obj2是否会被GC掉?
    class C{
         public Object x;
    }
    C obj1、obj2 = new C();
    obj1.x = obj2;
    obj2.x = obj1;
    obj1、obj2 = null;

    3.从gc root开始搜索,搜索不到的对象。
    分析:根对象查找、标记已经算是不错了,小于5%的人可以回答道这步,估计是引用计数的方式太“深入民心”了。基本可以得到这个问题全部分数。
    PS:有面试者在这个问补充强引用(类似new Object(),只要强引用还在就不会被回收)、弱引用(还有用但并非必须的对象,在系统将要发生OOM之前,才会将这些对象回收)、软引用(只能生存到下一次垃圾收集之前)、幻影引用(无法通过幻影引用得到对象,和对象的生命周期无关,唯一目的就是能在这个对象被回收时收到一个系统通知)区别等,不是我想问的答案,但可以加分。

    4.从root搜索不到,而且经过第一次标记、清理后,仍然没有复活的对象。
    分析:我期待的答案。但是的确很少面试者会回答到这一点,所以在我心中回答道第3点我就给全部分数。 
总结:超出了作用域或引用计数为空的对象;从gc root开始搜索找不到的对象,而且经过一次标记、清理,仍然没有复活的对象。
三.回答:做什么?
1.删除不使用的对象,腾出内存空间。
    分析:同问题2第一点。40%。
 2.补充一些诸如停止其他线程执行、运行finalize等的说明。
    分析:起码把问题具体化了一些,如果像答案1那样我很难在回答中找到话题继续展开,大约占40%的人。
3.能说出诸如新生代做的是复制清理、from survivor、to survivor是干啥用的、老年代做的是标记清理、标记清理后碎片要不要整理、复制清理和标记清理有有什么优劣势等。
    分析:也是看过《深入JVM虚拟机》的基本都能回答道这个程度,其实到这个程度我已经比较期待了。同样小于10%。
4.除了3外,还能讲清楚串行、并行(整理/不整理碎片)、CMS等搜集器可作用的年代、特点、优劣势,并且能说明控制/调整收集器选择的方式。
分析:同上面2个问题的第四点。 
总结:删除不使用的对象,回收内存空间;运行默认的finalize,JVM用from survivor、to survivor对它进行标记清理,对象序列化后也可以使它复活。

本文转载自:http://jeromecen1021.blog.163.com/blog/static/18851527120117274624888/

Hosee
粉丝 621
博文 135
码字总数 209956
作品 0
杭州
程序员
私信 提问
加载中

评论(0)

BATJ等大厂最全经典面试题分享

金九银十,又到了面试求职高峰期,最近有很多网友都在求大厂面试题。正好我之前电脑里面有这方面的整理,于是就发上来分享给大家。 这些题目是网友去百度、蚂蚁金服、小米、乐视、美团、58、...

老道士
2018/09/26
158
0
金三银四,2019大厂Android高级工程师面试题整理

最近整理了一波面试题,包括安卓JAVA方面的,目前大厂还是以安卓源码,算法,以及数据结构为主,有一些中小型公司也会问到混合开发的知识,至于我为什么倾向于混合开发,我的一句话就是"走上...

终端研发部
2019/04/02
79
0
finalize() 和 system.gc() 的区别

object = new ReallyBigObject(); 12. // more code here 13. object = null; 14. Which statement should be placed at line 14 to suggest that the virtual machine expend effort toward......

liangtee
2013/01/05
3.6K
2
深入Java虚拟机之 -- 总结面试篇

系列文章: 深入Java虚拟机之 -- 总结面试篇 深入Java虚拟机之 --- JVM的爱恨情仇 JAVA 垃圾回收机制(一) --- 对象回收与算法初识 JAVA 垃圾回收机制(二) --- GC回收具体实现 深入Java虚拟机...

夏至的稻穗
2019/05/06
0
0
BAT最新Java面试题汇总:并发编程+JVM+Spring+分布式+缓存等!

前言 作为一个开发人员,你是否面上了自己理想的公司,薪资达到心中理想的高度? 面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责。 今天给大家分享下我整理的Java架构面试...

别打我会飞
2019/06/03
328
0

没有更多内容

加载失败,请刷新页面

加载更多

并发编程概念篇-01进程与线程

进程是程序运行资源分配的最小单元 进程是操作系统进行资源分配的最小单元,其中资源包括:CPU,内存空间,磁盘IO等,同一进程中的多条线程共享该进程的全部系统资源,而进程和进程之间是相互...

wangmob
33分钟前
19
0
本科操作系统课练习3(和尚取水问题C++ Windows代码-多线程信号量)

某寺庙,有小和尚、老和尚若干。有一水缸,由小和尚提水入缸,老和尚从缸中取水饮用。水缸可容纳10桶水,水取自同一水井中,水井径窄,每次只能容一个水桶取水。水桶总数为3个,每次入、取缸...

whywhywhywhywhy
昨天
22
0
NAT深入浅出

未完待续,3月31号写完。 引用: NAT的几种类型(https://blog.csdn.net/phoenix06/article/details/70139756) 1. 基础 1.1 作用 1.2 意义 2. NAT种类 2.1 锥型NAT 锥型NAT指:内网同一个ip:...

mr_liang0
昨天
37
0
宜信davinci搭建

下载docker镜像 地址为 https://github.com/edp963/davinci-docker 修改配置信息这里尤其要注意修改邮箱部分 environment: - SERVER_ADDRESS=0.0.0.0 - SPRING_DATASOURCE_UR...

血神龙
昨天
24
0
mysql 5.7.25 解压版安装-整理

下载 mysql 的 解压版安装文件mysql-5.7.25-winx64.zip D:\mysql\master D:\mysql\salve 分别新建 data 和 binlog 目录,以及配置文件 my.ini master 配置文件 [mysqld]# 设置3306端口p...

jxlgzwh
昨天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部