面试官:如何进行 JVM 调优(附真实案例)

本文讨论了JVM是否需要调优,指出在大多数情况下遵循官方推荐配置即可,但在特定场景下仍需调优。JVM调优并非总是必要,但升级垃圾回收器并不完全解决问题。文章提供了一个真实案例,分析了metaspace导致的频繁FGC问题,并给出了优化策略。文章强调了适时监控JVM指标和理解调优步骤的重要性。
摘要由CSDN通过智能技术生成

前言

面试官:在工作中做过 JVM 调优吗?讲讲做过哪些 JVM 调优?

我一个QPS不到10的项目,上次问我缓存穿透缓存雪崩,这次问我 JVM 调优,我是真滴难。

不过大家别慌,热心的我给大家找来了几个满分回答,大家选择合适的使用。

回答1:听好了,下面将是我第一次 JVM 调优。

回答2:我一般面试的时候才调优。

回答3:我一般直接加机器、加内存。

回答4:老子直接用的 ZGC,调个蛇皮。

正文

1、JVM 究竟需不需要调优?

JVM 经过这么多年的发展和验证,整体是非常健壮的。个人认为99%的情况下,基本用不到 JVM 调优。

通常来说,我们的 JVM 参数配置大多还是会遵循 JVM 官方的建议,例如:

  • -XX:NewRatio=2,年轻代:老年代=1:2

  • -XX:SurvivorRatio=8,eden:survivor=8:1

  • 堆内存设置为物理内存的3/4左右

  • 等等

JVM 参数的默认(推荐)值都是经过 JVM 团队的反复测试和前人的充分验证得出的比较合理的值,因此通常来说是比较靠谱和通用的,一般不会出大问题。

当然,更重要的是,大部分的应用 QPS 都不到10,数据量不到几万,这种低压环境下,想让 JVM 出问题,说实话也挺难的。

大部分同学更常遇到的应该是自己的代码 bug 导致 OOM、CPU load高、GC频繁啥的,这些场景也基本都是代码修复即可,通常不需要动 JVM。

当然,俗话说得好,凡事无绝对,还是有一小部分场景,是可能需要用到 JVM 调优的。具体哪些场景,我们在下面介绍。

值得一提的是,我们这边所说的 JVM 调优更多的是针对自己的业务场景对 JVM 参数进行优化调整,使其更适合我们的业务,而不是指对 JVM 源码的改动。

2、JVM 调优没有什么必要,使用性能更好的垃圾回收器就能解决问题了?

这是我在网上看到的一个说法,因为赞同的人比较多,我估计有不少同学也会有这个想法,因此在这边谈下自己的看法。

1)实战角度

不考虑应付面试的因素,升级垃圾回收器确实会是最有效的方式之一,例如:CMS 升级到 G1,甚至 ZGC。

这个很容易理解,更高版本的垃圾回收器相当于是 JVM 开发人员对 JVM 做的优化,人家毕竟是专门做这个的,所以通常来说升级高版本的性能会有不少的提升。

G1 目前已经有开始在逐渐应用开来,周围有不少团队在 JDK8 中使用了 G1,就我了解到的,还是存在不少问题的,不少同学在不断进行参数的调整,而在 JDK11 中能优化成啥样还有待验证。

ZGC 目前应用的还比较少,仅从对外公布的数据来看很好看,最大暂停时间不超过10ms,甚至是1ms,大家都抱有很高的期望。但是从目前我收集到的一些资料来看,ZGC 也并不是银弹,已知的明显问题有:

  • 吞吐量相较于 G1 会有所下降,官方称最大不超过15%

  • ZGC如果遇到非常高的对象分配速率(allocation rate)的话会跟不上,目前唯一有效的“调优”方式就是增大整个GC堆的大小来让ZGC有更大的喘息空间——R大与ZGC领队沟通后的原话

而且,随着后续 ZGC 应用开来,后续一定会不断出现更多问题的。

整体而言,个人觉得 JVM 调优在某些场景下还是有必要的,毕竟有句话叫:没有最好的,只有最合适的。

2)面试角度

如果你回答直接升级垃圾收集器,面试官可能也赞同,但是这个话题可能就这样结束了,面试官大概率没听到他想要的回答,你在这题的肯定拿不到加分,甚至可能会被扣分。

所以,在面试的时候,你可以回答升级垃圾收集器,但是你不能只回答升级垃圾收集器。

3、JVM 何时优化?

忌过早优化。《计算机程序设计艺术》的作者高德纳(Donald Ervin Knuth&#x

  • 181
    点赞
  • 1295
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 21
    评论
回答: 在面试中,面试官可能会问你是否有JVM调优经验JVM调优是指通过调整JVM的参数和配置来优化Java应用程序的性能和稳定性。要回答这个问题,你可以提到以下几点。首先,你可以提到你对JVM的体系结构有深入的了解,包括方法区、堆、栈、本地方法栈和程序计数器等组成部分。\[1\]其次,你可以提到你了解如何观察JVM的运行参数,比如使用jps、jstack、jhat等JVM自带的工具命令,以及Java自带的JMC图形界面工具,来监控Java进程的线程状态、CPU和内存占用情况,以及GC状态等。\[3\]最后,你可以提到你有经验调整JVM的参数和配置,以优化Java应用程序的性能和稳定性。这包括调整堆大小、垃圾回收器的选择和配置、线程池的大小等。通过这些调优措施,可以提高应用程序的响应速度、减少内存占用和避免OOM等问题。 #### 引用[.reference_title] - *1* *2* [面试官问你关于JVM性能调优那些事儿,你要怎样优雅回答?](https://blog.csdn.net/wdj_yyds/article/details/124759534)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [面试经常被问 JVM 如何调优?这个问题该怎么回答?没有实际调优经验怎么办?](https://blog.csdn.net/weixin_60707895/article/details/129950623)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员囧辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值