- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
GC面试题及答案
一、基础概念题
你理解的GC核心目标是什么?实际工作中怎么判断GC是否“好用”?
答案:GC核心目标就两个——一是自动回收无用对象释放内存,避免内存泄漏;二是在回收过程中,尽量减少对业务线程的影响(比如缩短停顿时间)。实际判断时,主要看两个维度:一是业务侧是否有内存溢出(OOM),二是GC停顿是否影响业务响应(比如接口耗时突然飙升时,查GC日志看是不是有长时间FullGC)。
为什么JVM要搞分代收集?新生代和老年代的对象有啥区别?
答案:主要是基于“大部分对象活不长”的经验规律(比如方法里的局部变量,方法执行完就没用了),分代能提高回收效率。新生代里的对象都是刚创建的,存活时间短,回收频率高、速度快;老年代的对象是在新生代熬过多次回收的“老顽固”,存活时间长,回收频率低,但每次回收成本高。
二、核心算法题
标记-清除、标记-复制、标记-整理这三种算法,实际用的时候各有啥优缺点?分别适合哪个代?
答案:标记-清除的优点是不用移动对象,速度快;但会产生内存碎片,后续分配大对象时可能找不到连续空间,只能触发FullGC,适合老年代(老年代对象多,移动成本高,碎片问题可以靠后续整理弥补)。
标记-复制是把内存分成两块,只用一块,回收时把活对象复制到另一块,优点是没有碎片,效率高;但浪费一半内存,适合新生代(新生代对象存活少,复制成本低,浪费的内存能接受)。
标记-整理是标记后把活对象往一端挪,然后清掉后面的内存,优点是没碎片、不浪费内存;但移动对象要更新引用,速度慢,适合老年代(老年代回收频率低,慢一点但能解决碎片问题)。
什么是“浮动垃圾”?实际遇到过吗?一般怎么处理?
答案:浮动垃圾是GC过程中,业务线程还在生成的新垃圾(比如CMS的并发标记阶段,标记完后业务线程又创建了新的无用对象)。这种垃圾只能等下一次GC再回收。实际遇到时,比如CMS并发收集时,浮动垃圾太多导致老年代满了,会触发ConcurrentModeFailure,进而转成FullGC。处理方式通常是调大老年代内存,或者降低业务线程在GC期间的对象创建速度(比如优化代码里的临时对象生成)。
三、常见GC实现题
CMSGC的工作流程是啥?实际用的时候容易踩哪些坑?
答案:CMS主要分四步:初始标记(停业务,标记老年代里直接被引用的对象,快)→并发标记(和业务线程一起跑,标记所有活对象,慢)→重新标记(停业务,修正并发标记时被改的引用,比初始标记慢但比并发标记快)→并发清除(和业务线程一起跑,清掉无用对象)。
踩过的坑比如:一是并发清除时产生浮动垃圾,导致老年代不够用触发FullGC;二是内存碎片多了,大对象分配失败触发FullGC;三是CMS默认用“标记-清除”,老年代碎片多了后,即使有内存也分配不了,后来我们会加-XX:+UseCMSCompactAtFullCollection让FullGC时整理碎片。
G1GC相比CMS,最大的优势是什么?实际调优时重点关注哪些参数?
答案:最大优势是“可预测的停顿时间”——G1会把堆分成多个Region,回收时选回收效率高的Region(比如活对象少的),能控制单次GC停顿不超过设定值(比如-XX:MaxGCPauseMillis=200),适合大内存服务(比如堆内存8G以上)。
调优重点看三个参数:一是MaxGCPauseMillis(设业务能接受的最大停顿,比如200ms),二是InitiatingHeapOccupancyPercent(G1触发混合回收的堆占用阈值,默认45,内存紧张时可以调小,比如35),三是ConcGCThreads(并发GC线程数,太多会抢业务线程资源,一般设CPU核心数的1/4)。
四、调优与排查题
线上服务突然频繁FullGC,你会怎么排查?步骤说下
答案:第一步先看GC日志,用jstat-gcutil进程ID1000实时看FullGC次数和时间,确认是不是真的频繁;第二步用jmap-histo:live进程ID看存活对象top10,是不是有大对象或者对象数量异常多(比如集合没清空导致内存泄漏);第三步如果怀疑内存泄漏,用jmap-dump:format=b,file=heap.hprof进程IDdump堆快照,然后用MAT工具分析,看哪个对象持有大量引用没释放;第四步结合业务日志,看最近是不是有代码变更(比如新增了缓存没设过期时间)或者流量突增(比如瞬时创建大量对象)。
怎么判断GC参数调得“合理”?有没有实际案例说下?
答案:合理的标准是
您可能关注的文档
最近下载
- 建筑工程危险源识别及预防措施.doc VIP
- 团餐的工作流程.pptx VIP
- 华能汶上西曼克400KWP分布式光伏项目EPC总承包工程技术规范书.pdf VIP
- 二类医疗器械经营质量管理制度.docx VIP
- 超高压气井井口除砂器及现场应用.pptx VIP
- 2023年专升本考试:专升本《政治》历年真题汇编(共184题).doc VIP
- 汇川INOVANCE MD290系列通用变频器综合手册.PDF VIP
- 第6课 从小爱科学 第2课时(教学课件)2025统编版道德与法治三年级上册.pptx
- 2025年江苏省职业院校技能大赛中职组(法律实务)考试题库(含答案).doc VIP
- ISO9001质量管理体系基础培训-适合新人培训.ppt
文档评论(0)