【JAVA进阶架构师指南】之五:JVM性能调优

  首先给大家说声对不起,最近属实太忙了,白天上班,晚上加班,回家还要收拾家里,基本每天做完所有事儿都是凌晨一两点了,没有精力再搞其他的了.
  好了,进入正题,让我们来聊聊JVM篇最后一个章节----JVM性能调优.童鞋们随便打开一个大厂的招聘岗位JD,应该都会有JVM调优相关的描述,其实招聘方不一定要求候选人真的对JVM调优有实际调优经验,但是至少得有思路,知道应该怎样进行JVM层面的性能调优,说实话,知道如何进行JVM层面的性能调优的人,在面试中确实是有加分的.
  笔者在公司担任面试官的时候,经常会看到候选人简历描述有JVM性能调优经验,每当这个时候我都会问候选人一个问题,你是如何进行JVM性能调优的,很多童鞋的回答就是:噢,就是调整一下初始堆大小,新生代大小.这明显不是笔者想要的答案,因为这根本就不叫JVM性能调优.童鞋们对号入座一下,对JVM调优仅仅是我上述说的那样的,赶紧改一下简历,不要说自己会JVM性能调优.说实话,对JVM进行性能调优是对架构师的要求,甚至我敢说很多架构师都不一定有实际的JVM性能调优经验.话不多说,让我们进入正题,我们将从以下几点来讲解如何进行性能调优:

JVM性能调优的前提

JVM性能调优的预备知识

STW现象--Stop-The-World

垃圾回收器的种类

性能调优的目的

如何进行性能调优

JVM性能调优的前提

  所有有经验的架构师一定会有一个共识,JVM层面的性能调优一定是作为最后的调优手段,在此之前,一定要确保系统其它方面都已经做到了极致,无法再进行调优了,在这个前提下,才会考虑JVM性能调优.这里的其他方面包括从前端到架构到代码层面,我举一些例子
从浏览器/APP角度可进行的优化有:

减少HTTP请求次数.

使用客户端缓存.

浏览器启用压缩

使用CDN加速

动态资源和静态资源分离

从系统层面可进行的优化有:

启用缓存,比如redis缓存数据

使用集群

异步处理,比如引入消息队列

对代码的优化

  以上列出的每一点,都能单独拎出来讲很久,但是博文篇幅问题,就不细说了,有兴趣的童鞋可以自行下去了解,我们只着重说一下代码优化,相信大家都知道,业界比较公认的编码规范是阿里巴巴发布的<java开发手册>,里面的内容都是阿里集团多年来血的教训积累的精华,阿里集团内部有一个组织专门负责手册的编写和推广,并且在不断进行优化,最新版发布到泰山版了(我看的时候还是华山版,哈哈).如果有童鞋还不知道的,我建议去下载下来看一看.另外阿里云上有<java开发手册>的考试,如果通过了这个考试,说明你的编码规范还是不错的,有兴趣的童鞋可以去试一下.
  除此之外,童鞋们还应该了解JVM本身为我们悄悄做的各种优化,其中最重要的是JIT编译器的优化.我举几个例子,比如:方法内联,逃逸分析等.默认情况下,这些都是开启的,如果不开启这些功能,JVM性能会下降50%以上.除此之外,还有一些比如:栈上分配,TLAB等优化.这些内容由于平时我们开发中不会用到,是JVM在背后悄悄为我们做了优化,因此可能很多童鞋都不知道,但是如果想成为一个合格的架构师,这些内容都是必须要知道的,毕竟架构师的知识广度和深度决定了架构师的高度.
  除此之外,性能调优一定是基于性能测试的,空口说进行性能调优的都是耍流氓,只有在经过了实际的性能测试后,我们才知道系统的瓶颈在哪里,才知道那些方面需要进行调优,如何进行调优.常用的性能测试指标有TPS/QPS/吞吐量.并且默认所有的接口访问都遵循二八原则(接口每天80%的访问量集中在20%的时间内).

JVM性能调优的预备知识

  在进行JVM性能调优之前,我们还得了解JVM,比如我前面的几篇有关JVM的博文,都是需要掌握的,比如JVM内存模型,垃圾回收机制等等.另外我们还需要掌握一些进行JVM分析的工具.其实在我们安装JDK的时候,JDK已经为我们准备了许多有用的性能调优监控工具,我们可以看一下JDK安装目录下的bin目录:

file

jps: 主要用来输出JVM中运行的进程状态信息

jstack: 主要用来查看某个Java进程内的线程堆栈信息

jmap: 用来查看堆内存使用状况,一般结合jhat使用

jstat: JVM统计监测工具

jconsole: 图形化的统计工具

jvisualvm: 比jconsole功能更强的图形化的监控工具

  另外我们需要知道,当JVM发生OOM异常时,可以使用命令生成一个.hprof后缀的dump文件,该文件是某个时间节点的heap的快照,我们可以使用VisualVM来查看,也可以用第三方提供的一些工具,比如eclipse的MAT来查看内存溢出的原因.

STW现象

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyszzz.html