文档章节

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

Hosee
 Hosee
发布于 2016/05/12 21:36
字数 1526
阅读 979
收藏 26
GC

地球人都知道,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
粉丝 556
博文 135
码字总数 209956
作品 0
杭州
程序员
私信 提问
BATJ等大厂最全经典面试题分享

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

老道士
09/26
0
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
0
2
通往大神之路,百度Java面试题前200页。

基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie 和 Session的区别 fa...

java技术栈
2017/11/17
0
0
2018年BAT,京东,美团,滴滴等公司面试经验总结

一、心态 心态很重要! 心态很重要! 心态很重要! 重要的事情说三遍,这一点我觉得是必须放到前面来讲。 找工作之前,有一点你必须清楚,就是找工作是一件看缘分的事情,不是你很牛,你就一...

扁桃体准备发言了
09/09
0
0
同样的开发岗位,怎么职责相差辣么大

是这样子的,最近看到很多招聘信息,发现同样一个岗位,可叫法却很多,比如:招聘Java开发工程师,有以下这么几种叫法: Java开发工程师 Java开发工程师(偏核心产品方向) Java后台 Andrio...

大胖森
2015/09/24
2K
7

没有更多内容

加载失败,请刷新页面

加载更多

Andrew Ng教你如何引领公司进入AI时代

摘要: 人工智能时代,企业转型遇到困难?看看Andrew Ng的建议吧! AI(人工智能)技术就像100年前的电力一样,正准备改变每个行业。从现在到2030年,它将创造约13万亿美元的GDP增长。虽然它...

阿里云官方博客
6分钟前
0
0
斗图咖(www.doutuka.com)上线纪念

网站名称:斗图咖 网站描述:是一款年轻人都在玩的斗图网站,来斗图咖一起斗图装逼交朋友吧。站长每天上传收集的最新最火斗图,供大家娱乐聊天发表情;后期也会开发表情自主设计,自己设计表...

focusone
27分钟前
3
0
Spring AOP 切面编程记录日志和接口执行时间

最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx、tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统...

编程SHA
38分钟前
5
0
15个Spring的核心注释示例

众所周知,Spring DI和Spring IOC是Spring Framework的核心概念。让我们从org.springframework.beans.factory.annotation和org.springframework.context.annotation包中探索一些Spring核心注......

java菜分享
44分钟前
2
0
[LintCode] Binary Tree Level Order Traversal(二叉树的层次遍历)

描述 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 样例 给一棵二叉树 {3,9,20,#,#,15,7} : 3 / \9 20 / \ 15 7 返回他的分层遍历结果: [ [3], [...

honeymose
53分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部