面试题目:
地球人都知道,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的调优的策略。
分析:列举一些我期望的回答:eden满了minor gc,升到老年代的对象大于老年代剩余空间full gc,或者小于时被HandlePromotionFailure参数强制full gc;gc与非gc时间耗时超过了GCTimeRatio的限制引发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:有面试者在这个问补充强引用、弱引用、软引用、幻影引用区别等,不是我想问的答案,但可以加分。
4.从root搜索不到,而且经过第一次标记、清理后,仍然没有复活的对象。
分析:我期待的答案。但是的确很少面试者会回答到这一点,所以在我心中回答道第3点我就给全部分数。
总结:超出了作用域或引用计数为空的对象;从gc root开始搜索找不到的对象,而且经过一次标记、清理,仍然没有复活的对象。
三.回答:做什么?
1.删除不使用的对象,腾出内存空间。
分析:同问题2第一点。40%。
2.补充一些诸如停止其他线程执行、运行finalize等的说明。
分析:起码把问题具体化了一些,如果像答案1那样我很难在回答中找到话题继续展开,大约占40%的人。
补充一点题外话,面试时我最怕遇到的回答就是“这个问题我说不上来,但是遇到的时候我上网搜一下能做出来”。做程序开发确实不是去锻炼茴香豆的“茴”有几种写法,不死记硬背我同意,我不会纠语法、单词,但是多少你说个思路呀,要直接回答一个上网搜,我完全没办法从中获取可以评价应聘者的信息,也很难从回答中继续发掘话题展开讨论。建议大家尽量回答引向自己熟悉的,可讨论的领域,展现给面试官最擅长的一面。
3.能说出诸如新生代做的是复制清理、from survivor、to survivor是干啥用的、老年代做的是标记清理、标记清理后碎片要不要整理、复制清理和标记清理有有什么优劣势等。
分析:也是看过《深入JVM虚拟机》的基本都能回答道这个程度,其实到这个程度我已经比较期待了。同样小于10%。
4.除了3外,还能讲清楚串行、并行(整理/不整理碎片)、CMS等搜集器可作用的年代、特点、优劣势,并且能说明控制/调整收集器选择的方式。
分析:同上面2个问题的第四点。
总结:删除不使用的对象,回收内存空间;运行默认的finalize,当然程序员想立刻调用就用dipose调用以释放资源如文件句柄,JVM用from survivor、to survivor对它进行标记清理,对象序列化后也可以使它复活。
千万不要说网上google下,就算说也要说出自己以前遇到这样的问题是怎么处理的,对这个知识有什么认识想法,然后可以反问下考官,这样可以不让技术型的考官为如何继续话题而对你无语,呵呵。
相关推荐
为什么要有GC? 在编程语言中,开发者可以动态地分配和释放内存资源。但是,如果不释放不再使用的内存资源,可能会导致内存泄露和溢出,影响系统性能和稳定性。GC机制可以自动追踪和回收不再使用的对象,释放内存...
"GC要做的事情1" ...GC要做的事情是判断哪些内存需要被回收、什么时候回收、如何回收,以及如何判断哪些对象需要回收。GC是Java虚拟机中一个非常重要的组件,作用于避免内存泄露和溢出,提高程序的稳定性和性能。
标题 "GC6153_SERIAL_GC6153" 指向的是一款基于MTK(MediaTek)平台的驱动程序,专为控制SPI接口的GC6153芯片而设计。这款驱动程序的主要功能是确保GC6153芯片在系统中能够正确地被初始化、配置和操作,从而实现其...
GC2053采用的CMOS工艺使得它在保持高图像质量的同时,能有效降低设备的运行能耗,延长电池寿命,适用于需要长时间工作的设备。 此外,GC2053的Data Sheet提供了详细的技术参数,如感光度、信噪比、动态范围等,这些...
在GC2000中,用户可以方便地对GERBER文件进行颜色配置,将不同类型的层分配不同的颜色,以便快速识别和区分。此外,软件还具备层叠加显示的功能,这对于检查多层板的层间对齐和交互至关重要。工程师可以轻松地查看...
标题中的"SENSOR_GC1054.rar_1054-sensor_SENSOR_GC1054_gc1054"暗示了我们正在处理一种名为GC1054的传感器,这可能是一款专用于图像处理的传感器。在IT行业中,这类传感器通常被应用于摄像头设备、机器视觉系统或...
《MT65xx_GC032A_Driver_20170614_GC032A_GC032A_Drive》是一款专为MT65xx平台设计的GC032A图像传感器驱动程序,它在原有的厂家驱动基础上进行了一些定制化的改进,以优化性能和效果。此驱动程序的更新日期为2017年6...
### 一、什么是GC? 在Java中,内存管理主要由垃圾收集器负责。GC自动回收不再使用的对象所占用的内存空间,以防止内存泄漏。这个过程包括识别并释放无用的对象,为新创建的对象分配空间,以及调整堆内存布局。然而...
GC4023 CMOS图像传感器数据手册 GC4023是一款高性能的CMOS图像传感器,用于capturing高质量图像。该传感器具有1/2.7英寸的感光面积、4Mega像素的高分辨率和低噪音的特点。该传感器的datasheet提供了详细的技术规格...
GC.log文件是JVM在运行过程中生成的,记录了垃圾收集的相关信息,包括GC的开始时间、结束时间、耗时、内存区域的变化等。GCViewer通过读取这些日志,可以实时监控GC的执行情况,对于排查性能问题和调优有着重要的...
GC02M1 datasheet GC02M1是一款CMOS图像传感器,具有高分辨率、低噪声和高灵敏度等特点。下面是根据GC02M1 datasheet的内容生成的相关知识点: 1. 传感器概述 GC02M1是一款1/5英寸的CMOS图像传感器,具有200万像素...
GC2145 CMOS图像传感器数据手册 GC2145是一种1/5英寸的UXGA CMOS图像传感器,用于图像采集和处理应用场景。下面是GC2145数据手册的详细解读: Sensor Overview GC2145是一种高性能的CMOS图像传感器,具有高分辨率...
每个 GC worker 启动的时候都会有一个数字 ID 标识,这个 ID 其实就是对应到 gc pool 里面的 Object 的 ID 名称,GC 的任务列表就存储在每个 gc pool 里面对应的 Object 的 omap 中。 GCworker 的随机选择算法: ...
《MT6261_GC6153_Driver_V0:格科微GC6153模组驱动解析》 在电子技术领域,驱动程序扮演着至关重要的角色,它是硬件设备与操作系统之间的桥梁,使得软件能够有效控制硬件设备。本文将深入探讨"MT6261_GC6153_Driver...
该驱动是为了使gc0310这款图像传感器在搭载高通骁龙处理器的设备上正常工作,确保前置摄像头功能的稳定性和效率。在开发或调试过程中,如果遇到任何问题,描述中提示可以直接联系相关人员进行咨询。 在Android系统...
【标题】"gc2355_mipi_raw_摄像头gc2355驱动_" 指的是一个针对特定型号摄像头GC2355的驱动程序,该驱动是...开发人员在使用和修改这个驱动时,需要对MIPI协议、嵌入式系统驱动开发、以及GC2355传感器的特性有深入理解。
《GC-PowerStation 2019中文版:SMT导坐标与GERBER文件处理详解》 GC-PowerStation是一款专业且功能强大的电子制造软件,主要用于SMT(表面贴装技术)工艺中的导坐标和GERBER文件处理。该软件以其高效、精准的特性...
这时,我们需要对GC日志进行深入分析,以优化程序性能。GCViewer就是这样一款强大的工具,它专门用于可视化分析Java程序的GC日志,包括堆内存、年轻代、老年代和永久代的变化,以及Full GC的情况。 GCViewer是由...
《GC5025.tar.gz:RK3368平台上的GC5025摄像头驱动详解》 在嵌入式系统开发中,摄像头驱动扮演着至关重要的角色,它连接硬件设备与软件应用,使得图像捕获和处理成为可能。本文将深入探讨针对RK3368平台的GC5025...