- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
JVM性能调优面试题及答案
1.实际工作中,你怎么判断JVM需要性能调优?有哪些具体的指标或现象?
答案:不会只看单一指标,而是结合业务场景和多维度数据判断。首先看业务层面:接口响应时间突然变长(比如从50ms涨到200ms)、吞吐量下降(比如每秒处理请求从1000降到500)、定时任务执行超时;然后看JVM层面:GC日志里FullGC频繁(比如10分钟内超过3次)、单次FullGC耗时过长(超过1秒,业务敏感场景甚至500ms就需要关注)、年轻代MinorGC后存活对象太多(导致频繁晋升老年代);还会看系统层面:CPU使用率持续过高(比如长期80%以上,且排查后是JVM进程占用)、内存占用异常(堆内存使用率长期90%以上,且无下降趋势)。比如之前做电商秒杀,预热阶段就出现每2分钟1次FullGC,单次耗时1.2秒,直接影响秒杀峰值的响应,这时候就必须调优。
2.年轻代和老年代常用的GC算法有哪些?实际调优时,怎么选择合适的GC组合?
答案:年轻代主流是ParallelScavenge(并行)、Serial(串行,一般仅本地开发用)、G1的YoungGC;老年代是ParallelOld(并行)、CMS(并发)、G1的MixedGC。选择时核心看业务优先级:
如果是后台任务(比如数据同步),吞吐量优先,选“ParallelScavenge+ParallelOld”,因为并行GC吞吐量高,虽然停顿时间稍长,但后台任务对停顿不敏感,之前做数据导出服务就用这个组合,能最大化CPU利用率;
如果是用户交互类服务(比如APP接口),低停顿优先,JDK8及以下选“ParNew+CMS”(注意CMS的ConcurrentModeFailure问题,要预留内存),JDK9+直接用G1,比如做支付接口时,用G1把MaxGCPauseMillis设为200ms,能满足接口低延迟要求;
超大堆场景(比如堆内存16G以上),优先G1或ZGC,避免CMS的内存碎片问题,之前做大数据计算时,堆设32G,用G1比CMS减少了30%的FullGC次数。
3.调优时常用哪些JVM工具?举个例子,说明你怎么用工具定位内存泄漏问题?
答案:常用的有jstat(看GC统计)、jmap(导堆快照)、jstack(看线程栈)、Arthas(线上排查)、MAT(分析堆快照)。
之前排查一个订单系统内存泄漏的例子:首先发现堆内存使用率每天涨5%,3天就触发OOM。第一步用jstat-gcutil进程ID100010,观察到老年代使用率持续上升,MinorGC后年轻代存活对象正常,但老年代没释放;第二步用jmap-dump:format=b,file=heap.hprof进程ID,导出堆快照(注意线上导出要加-XX:+HeapDumpOnOutOfMemoryError,避免手动导出影响服务);第三步用MAT打开快照,看“LeakSuspects”,发现一个静态HashMap的size有100多万,里面存的是订单缓存,但没设置过期清理;再结合jstack看线程,发现有个定时清理缓存的线程挂掉了(因为未捕获异常),导致缓存只增不减。最后修复线程异常处理,加缓存过期策略,内存泄漏解决。
4.给JVM设置堆内存参数时,-Xms和-Xmx为什么建议设成一样?年轻代-Xmn的大小怎么调整才合理?
答案:-Xms(初始堆)和-Xmx(最大堆)设成一样,是为了避免JVM频繁调整堆大小:如果-Xms小于-Xmx,堆内存不够时会扩容,扩容时需要暂停应用(类似FullGC的停顿);如果内存充足时又会缩容,频繁伸缩会浪费CPU资源,还导致响应时间波动。所以生产环境一般把两者设成相同,比如-Xms8g-Xmx8g,让堆大小固定,减少内存伸缩的开销。
-Xmn(年轻代大小)调整要看业务对象生命周期:如果业务中短期对象多(比如接口请求中的临时对象),可以适当调大Xmn,让对象在年轻代就被回收,减少晋升老年代的概率,比如做API服务时,Xmn设为堆内存的1/3(比如堆8g,Xmn3g);但如果Xmn太大,会导致老年代变小,容易触发FullGC;如果Xmn太小,年轻代GC频繁(比如每秒几次MinorGC),也会影响性能。之前做一个报表服务,因为报表对象是短期的,一开始Xmn设1g(堆8g),MinorGC每秒2次,后来调到3g,Mi
文档评论(0)