• JVM 调优系列 1:“精通 JVM 调优,有过 JVM 调优经验”,简历敢写吗?薪资涨 5k 的技巧!


    文章目录

    • 前言
    • 一、部分大厂对于 JVM GC 的面试题
      • 1.1、百度
      • 1.2、顺丰
      • 1.3、京东
      • 1.4、淘宝
      • 1.5、阿里、蘑菇街
    • 二、Garbage Collectors(GC)作何使用
    • 三、GC 的十种类型
    • 四、JVM 的版本参数信息
      • 4.1、查看 Java 启动时所有默认的命令行参数
      • 4.2、查看 Java 启动时 GC 的参数信息
    • 五、GC 的分代模型与分区模型
      • 5.1、分代模型
        • 5.1.1、新生代
        • 5.1.2、老年代
    • 总结

    前言

    现在除了一些有工作和开发经验的大神,基本很少有人在简历上敢写 “精通 JVM 调优,有过 JVM 调优经验”,因为应聘者如果写这句话就意味着你的面试将会是很 “难过” 的,面试官会变着法的问你如何进行 JVM 系列调优,如果你的基础比较薄弱或者是仅仅背面试题速成,那么你很可能在面试中露馅。JVM 作为 Java 的核心,面试后端开发工程师或者架构师这都是必备的技能。既然 JVM 如此重要,那我就在本系列中完整的过一遍,让你敢于在简历上写 “精通 JVM 调优,有过 JVM 调优经验”,薪资涨 5k!


    在聊 JVM 调优和 GC 之前,我们先看看当下就业环境中面试对于 JVM 和 GC 的一些相关面试题,看看企业开发岗需要什么样的人才。

    一、部分大厂对于 JVM GC 的面试题

    说明:以下数据来源于 2019~2020 年一些大厂的面试题。

    1.1、百度

    • CMS 和 G1 的异同。
    • G1 什么时候引发 FullGC?
    • 说一个最熟悉的垃圾回收算法。
    • 吞吐量优先和响应时间优先的回收器有哪些?

    1.2、顺丰

    • 怎么判断内存泄漏?
    • 讲一下 CMS 的流程。

    1.3、京东

    • 为什么压缩指针超过 32G 失效?

    1.4、淘宝

    • 什么是内存泄漏?GC 调优有经验吗?一般出现 GC 问题你怎么解决?

    1.5、阿里、蘑菇街

    • ThreadLocal 有没有内存泄漏问题?
    • G1 两个 Region 不是连续的,而且之间还有可达的引用,我现在要回收一个,另一个怎么处理?
    • 讲一下 JVM 堆内存管理(对象分配过程)。
    • 听说过 CMS 的并发预处理和并发可中断预处理吗?
    • 到底多大的对象会被直接扔到老年代?

    看了面试题,作何感想?可能有人觉得简单,有人一知半解,听过但是不会。不要急!我们慢慢来。

    二、Garbage Collectors(GC)作何使用

    首先我们都知道,在 Java 当中,我们在创建一个对象之后,就可以无需再去管它,该对象不被使用变成一个垃圾之后,谁去进行处理?Garbage Collectors(垃圾回收器)。

    备注:后续文章内容 Garbage Collectors 皆用 GC 代替。

    三、GC 的十种类型

    JVM 作为 Java 的枢纽,管理着全部的内存,而对于内存的分配和回收就是由垃圾回收器来控制。

    从 JVM 的诞生到现在 2021 年,一共产生过十种类型的垃圾回收器,如下图所示:


    这里呢大家可以对这十种垃圾回收器仅作了解,我们将会在后续的章节中一一为大家介绍。

    四、JVM 的版本参数信息

    现在企业开发绝大多数使用的版本为 1.8。我本地的开发版本也是 1.8,我们就通过该版本来进行演示。


    如果我们直接将程序部署到 JVM 上,没有做过任何调优动作,1.8 版本的默认 GC 为 Parallel

    可能有人会有疑问:如何查看开发环境下 JVM 默认的 GC 版本信息呢?别急,往下看。

    首先我们来认识以下几个命令,我们打开 CMD 命令界面。

    4.1、查看 Java 启动时所有默认的命令行参数

    输入以下 Shell 命令:

    java -XX:+PrintCommandLineFlags

    这是我们就可以看到打印出的 Java 启动时所有默认的命令行参数,如下图所示:

    4.2、查看 Java 启动时 GC 的参数信息

    如果只需要查看本地环境下的 GC 参数信息,我们输入如下 Shell 命令即可:

    java -XX:+PrintCommandLineFlags -version

    我们可以从控制台的返回信息得知,1.8.0_251-b08 版本所对应的默认 GC 为 Parallel,如下图所示:

    五、GC 的分代模型与分区模型

    上面我们已经说到,内存的分配和回收就是由垃圾回收器来控制。

    我们将 GC 的使用分为两大类,分别是:分代模型分区模型

    • 分代模型:两个垃圾回收器混合控制系统中的垃圾回收。
    • 分区模型:不再分代,一个垃圾回收器就足够。

    在本节中我们将着重对分代模型进行介绍。

    5.1、分代模型

    分代模型将内存分为两个大的部分,新生代和老年代

    如下图所示,左半部分为新生代,右半部分为老年代:


    新生代和老年代所对应的回收算法应用

     

    • 新生代大量死去,少量存活,采用复制算法。
    • 老年代存活率高,回收较少,采用 MC 或 MS。

    5.1.1、新生代

    刚刚诞生的的对象为 “新生”,存放在新生代区域里面。随着程序的运行,大部分 “新生对象” 被垃圾回收。

    5.1.2、老年代

    垃圾回收器回收了多次没有回收掉的对象被称为 “老年”,就被存放在老年代中。

    在默认情况下 JDK 1.8 没有调参数、调优用的就是 GC 的分代模型。


    总结

    在本文中我们通过面试题知道了大厂开发对于 JVM 的要求,暂时了解在 JVM 中存在的十种 GC,学会如何查看本地开发环境默认的 GC,掌握了 GC 的两种使用方式,分代模型与分区模型,明白什么样的对象属于什么代,存放在内存中的什么位置。同时,在新生代和老年代中又会诞生各种各样的垃圾回收算法,我们将在下一小节讲解。

    更多的java课程学习路线,笔记,面试等架构资料,需要的同学可以私信我(资料)即可免费获取!

     

     

     

  • 相关阅读:
    QT添加右键菜单(二):QWidget的右键菜单策略
    解决雪花算法生成的ID传输前端后精度丢失
    一个较通用的makefile解析
    计算机的运算方法
    JAVA面试题——创建线程的三种方式
    交易系统:资金账户与交易账户的规划
    《C++避坑神器·十九》C++多线程使用,啥也不懂看它就对了
    智能电网中需求响应研究(Matlab代码实现)
    互斥锁,自旋锁,读写锁
    NSDateFormatter格式化字符串时间上相差8个小时的问题处理
  • 原文地址:https://blog.csdn.net/uuqaz/article/details/125562614