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


前言

现在除了一些有工作和开发经验的大神,基本很少有人在简历上敢写“精通 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 的两种使用方式,分代模型与分区模型,明白什么样的对象属于什么代,存放在内存中的什么位置。同时,在新生代和老年代中又会诞生各种各样的垃圾回收算法,我们将在下一小节讲解。

在这里插入图片描述


我是白鹿,一个不懈奋斗的程序猿。望本文能对你有所裨益,欢迎大家的一键三连!若有其他问题、建议或者补充可以留言在文章下方,感谢大家的支持!
更多资讯微信搜索公众号【WDeerCode代码圈

猜你喜欢

转载自blog.csdn.net/qq_22695001/article/details/114830531