面试官问你GC怎么调优?思路是什么呀?我直接把这篇文章甩到面试官脸上

        有学过JVM垃圾回收机制的小伙伴肯定了解过CG调优,当面试官问到这个问题时,相信很多小伙伴第一时间想到的就是调节几个参数,调节一下分代的大小。简单的可以用这么一句话概括,水多了加面,面多了加水。十分形象了。可是这么简单的几句话怎么能让面试官觉得你可以修航母呢?接下来,这篇文章就以修航母的角度来好好教教你怎么回答这个问题,让面试官耳目一新!

        思路清晰,回答不虚。

        这里先放一张思维导图来介绍一下回答GC调优的思路。

         通过这张图我们可以梳理一下思路,首先GC调优可以从垃圾收集器的选择开始,根据业务环境选择不同的垃圾收集器,比如一个业务对低延迟的需求比较高,那么我们就可以选择以低延迟为目的的一些垃圾收集器比如:CMS和G1。又或者实际业务对吞吐量有着比较高的需求,那么我们就可以选择Parallel Scavenge收集器。所以第一步就是选择合适的垃圾收集器。

        选完合适的垃圾收集器,现在就要对垃圾回收进行具体的调优了,正所谓最快的垃圾回收是不回收垃圾,那么对于垃圾产生那么多,我们首先需要考虑自己的代码是不是有问题,是不是编码问题造成了许多的数据冗余?是不是那个sql语句选出的数据太冗余了?考虑这个场景是不是可以使用软引用来降低内存占用呢?这就是垃圾回收调优的第二步,不发生GC就是最好的GC。

        说完第二步,检查完代码确实没有什么问题,但是就是容易发生GC怎么办呢?好,我们接着往下讲。我们知道JVM的堆是分了几个代,一个是老年代,一个是新生代,新生代又分了Eden区和Servivor区,根据这个代不同的特性,我们的GC调优也会对应不同的策略。

        第一个我们看新生代,新生代的特点是:所有的new操作分配内存都是非常廉价的、死亡对象回收零代价(新生代是标记复制算法)、大部分对象用过即死(朝生夕死)、MInor GC 所用时间远小于Full GC,所以根据这几个特点。我们就有相应的调优策略:调节新生代内存大小。那么怎么调呢? 一味地加大新生代地内存吗?还是一味地减少新生代内存呢?我们要知道加大新生代带内存会来什么后果,减少新生代内存会带来什么后果。加大新生代内存,我们可以获得更大的新生代内存,从而减少minor GC发生的次数,但是老年代内存占比有所降低,会更频繁地触发Full GC。而且触发Minor GC时,清理新生代所花费的时间会更长。那减少新生代内存会带来什么后果呢?频繁触发Minor GC,会STW,使得吞吐量下降。既然两者各有优劣,我们怎么才能平衡这个新生代的内存呢?JVM虚拟机HotSpot是这么建议的:新生代内存设置为内容纳[并发量*(请求-响应)]的数据为宜。

        新生代里面又有幸存区,面对幸存区我们又要如何处理呢?我们知道,幸存区是来放GC之后存活的对象的,并且它有晋升机制,那么针对这个特性,我们调优的时候就要考虑,晋升阈值配置得当,让长时间存活的对象尽快晋升;稍微扩大幸存区,幸存区需要能够保存 当前活跃对象+需要晋升的对象;

        说完新生代,我们剩下老年代了,对于老年代,我们知道,老年代是使用标记整理算法进行GC的,所以发生一次老年代的GC会比一次MinorGC用的时间多的多,那么我们首先想到的就应该是避免发生FullGC,避免发生FullGC的方法那就是,先去调优新生代,或者重复之前的调优方案,都试过了之后,还是容易发生FullGC那么我们就可以考虑增加老年代的内存来减少FullGC的次数了。

        好了,总结一下思路就是这样:首先根据业务场景选择合适的回收器,顺带介绍一下垃圾回收器的特点。然后就是介绍各个分代的特点以及其对应的调优方法。

        谢谢你读到这里!

### JVM 概述 JVM(Java Virtual Machine)经过多年的化和发展,其默认设置已经能够满足大多数应用场景的需求[^1]。然而,在某些特定场景下,可能仍然需要针对具体业务需求进行以提升性能或解决运行中的瓶颈题。 #### 常见的 JVM 性能题 在实际开发过程中,可能会遇到诸如 **内存泄漏**、**垃圾回收 (GC)** 时间过长以及 **应用卡顿** 的情况[^2]。这些题通常可以通过分析堆栈信息、监控 GC 日志以及其他诊断工具来定位根本原因并采取相应的措施加以改进。 --- ### JVM 的主要方向 以下是几个主要可以从以下几个方面入手来进行 JVM 参数整: #### 1. 内存分配与管理 合理规划 Java 应用程序所需的内存大小至关重要。这包括但不限于以下几项: - 设置初始堆大小 (`-Xms`) 和最大堆大小 (`-Xmx`), 确保两者尽可能接近可以减少动态扩展带来的额外开销。 - 对新生代(`Young Generation`)区域进一步细分, 如 Eden Space 及 Survivor Spaces 大小比例可通过 `-XX:NewRatio`, `-XX:SurvivorRatio` 来控制. #### 2. Garbage Collection(GC)策略的选择 不同的应用程序负载特性适合不同类型的收集器: - 并发标记清除(CMS): 当追求低延迟时可考虑使用此算法. - G1 收集器: 提供更平衡的方式处理吞吐量和响应时间之间的权衡; 推荐现代多核处理器环境下的大型数据集上采用. 有关这些选项的具体含义及其适用范围已经在业界广泛讨论过了. #### 3. 类加载机制微 如果项目存在大量短生命周期对象频繁创建销毁的情况,则应该关注类卸载行为是否正常工作;另外还可以尝试启用元空间压缩功能(-XX:+UseCompressedOops),从而降低指针占用的空间消耗。 #### 4. 编译期化建议 开启即时编译(JIT Compilation)有助于提高执行效率,而关闭偏向锁则适用于高并发读写操作较多的服务端架构之中。 --- ### 实战案例分享 假设某电商平台高峰期订单服务出现了明显的响应变慢现象,经初步排查发现 Full GC 发生频率异常增高。于是决定按照如下步骤实施解决方案: 1. 启动参数加入打印详细的gc日志命令行开关:`-verbose:gc -Xloggc:/path/to/gc.log`. 2. 使用可视化工具如 VisualVM 或 MAT(Memory Analyzer Tool) 导入上述记录文件做深入剖析。 3. 根据报告提示适当增大年轻代容量至整个heap的一半左右,并切换到G1模式测试效果变化。 最终结果显示平均请求耗时下降约百分之三十以上,用户体验得到显著改善. ```bash java -server \ -Xms8g -Xmx8g \ -XX:+UseG1GC \ -XX:MaxGCPauseMillis=200 \ -jar your-application.jar ``` --- ### 面试准备要点 对于参加技术面试的朋友来说,掌握基础理论的同时也要熟悉一些典型场景下的应对办法。比如被及 “当面临 OOM 错误该如何快速定位?” 这样的题目时,除了口头描述外最好还能配合演示简单的脚本或者截图辅助说明过程更加分哦! ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值