Java性能监控与调优
文章目录
一、内容介绍
1.1 内容介绍
-
Java性能监控与调优
在开发环境中我们一般都用不到,但是在生产环境中却尤为重要,原因有如下:- 生产环境比较复杂
- 生产环境出现问题不好进行定位
所以说对监控来说是非常重要。
-
以前的情况:
- 可能多少有些了解
- 没有系统的学习过原理
- 没有上手实践过
-
会帮你迈过哪些坎?
- 生产环境发生了内存溢出该如何处理?
- 生产环境应该给服务器分配多少内存合适?
- 如何对垃圾收集器的性能进行调优?
- 生产环境CPU负载飙高该如何处理?
- 生产环境应该给内存分配多少线程合适?
- 不加log如何确定请求是否执行了某一行代码?
- 不加log如何实时查看某个方法的入参和返回值?
- JVM的字节码是什么东西?
- 循坏体中做字符串+拼接为什么效率低?
- 字符串+拼接一定就是StringBuilder.append吗?
- String常量池是咋回事?
- i++与++i到底哪种写法效率更高?
-
本博客能让你收获什么?
- 熟练使用各种监控和调试工具
- 从容应对生产环境中遇到的各种调试和性能问题
- 熟悉JVM的字节码指令
- 深入理解JVM的自动内存回收机制,学会GC调优
- 从容应对面试中关于性能调优和调试的问题
- 独当一面走向高级工程师很重要的一步
二、基于JDK命令行工具的监控
主要讲解JDK的命令行监控工具的使用,包括jps、jinfo、jstat、jmap、jstack,并结合MAT实战如何定位内存溢出,实战如何定位死循环和死锁。
2.1 JVM的参数类型
-
三大类型:
- 标准参数(基本不会变的)
-help -server -client -version -showversion -cp -classpath
- X参数
-Xint: 解释执行 -Xcomp: 第一次使用就编译成本地代码 -Xmixed:混合模式,JVM自己来决定是否编译成本地代码
- XX参数(用的非常多)
- 非标转化参数
- 相对不稳定
- 主要用于JVM调优和Debug
- 标准参数(基本不会变的)
-
XX参数分类:
- Boolean类型:
- 非Boolean类型:
- Boolean类型:
-
Xmx -Xms:
- 不是X参数,而是XX参数
-Xms
等价于-XX:InitialHeapSize
-Xmx
等价于-XX:MaxHeapSize
2.2 查看JVM运行时参数
-
图示:
-
PrintFlagsFinal:
- 图示:
- 其中:
=
表示默认值,:=
被用户或者JVM修改后的值
- 图示:
-
jvm的常用工具:
- jps将打印所有正在运行的 Java 进程。
- jstat允许用户查看目标 Java 进程的类加载、即时编译以及垃圾回收相关的信息。它常
用于检测垃圾回收问题以及内存泄漏问题。 - jmap允许用户统计目标 Java 进程的堆中存放的 Java 对象,并将它们导出成二进制文
件。 - jinfo将打印目标 Java 进程的配置参数,并能够改动其中 manageabe 的参数。
- jstack将打印目标 Java 进程中各个线程的栈轨迹、线程状态、锁状况等信息。它还将
自动检测死锁。 - jcmd则是一把瑞士军刀,可以用来实现前面除了jstat之外所有命令的
-
jps举例:
-
jinfo举例:
2.3 jstat查看JVM统计信息
- jstat能查询哪些信息?
- 类加载
- 垃圾收集
- JIT编译
- 命令:
- 命令格式:
- 类装载:
- 垃圾收集:
- GC输出结果:
这里的S0、S1是年轻代,OC、OU是老年代。每个JDK版本的结果可能有出入
- 命令格式:
- 官方文档
- JVM的内存结构:
- JIT编译:
2.4 演示内存溢出
2.5 导出内存映像文件
2.6 MAT分析内存溢出
2.7 jstack与线程的状态
2.8 jstack实战死循环与死锁
2.9 常见问题
三、基于JVisualVM的可视化监控
主要学习可视化监控工具JVisualVM的使用,学习如何用它来监控本地和远程的JAVA进程,包括监控内存、线程、方法执行时间等。
3.1 监控本地java进程
3.2 监控远程的java进程
3.3 常见问题
四、基于Btrace的监控调试
主要学习如何安装btrace、如何编写btrace脚本来对生产环境下的代码进行监控调试,比如获取生产环境下某个方法的参数、返回值、异常、执行的行号等等。
4.1 btrace入门
4.2 拦截构造函数、同名函数
4.3 拦截返回值、异常、行号
4.4 拦截复杂参数、环境变量、正则匹配拦截
4.5 注意事项
4.6 工具补充
五、Tomcat性能监控与调优
主要学习如何在本地来远程调试tomcat和对tomcat服务器的内存、线程等做监控,会介绍两款监控工具–tocat自带的manager和开源的psi-probe,然后会讲解常用的tomcat的调优的方法
5.1 tomcat 远程debug
5.2 tomcat-manager监控
5.3 psi-probe监控
5.4 tomcat优化
5.5 常见问题
六、Nginx性能监控与调优
主要学习如何安装nginx,并监控nginx的连接信息和请求信息,会介绍两款命令行工具ngx_http_stub_status和ngxtop,还有一款可视化工具nginx-rrd,然后会讲解常用的nginx的调优的方法
6.1 nginx安装
6.2 ngx_http_stub_status 监控连接信息
6.3 ngxtop监控请求信息
6.4 nginx-rrd图形化监控
6.5 nginx优化
七、JVM层GC调优
主要熟悉JVM的内存结构,常见的垃圾回收算法和垃圾收集器,不同的垃圾收集器的日志结构,然后介绍两款可视化的日志分析工具,通过分析日志得到GC的性能指标和出现GC的原因,最后带大家实战GC垃圾回收调优。
7.1 JVM的内存结构
7.2 常见的垃圾回收算法
7.3 垃圾收集器
7.4 GC日志格式详解
7.5 可视化工具分析GC日志
7.6 ParallelGC调优
7.7 G1调优
7.8 本章总结
7.9 常见问题
八、JVM字节码与Javadiamante层调优
主要学习JVM的字节码指令,从字节码层面讲解一些常见问题的底层原理(面试能回答上的话, 绝对加分),比如:i++和++i哪一种效率高?循环体中做字符串+拼接为什么效率低?然后会重点对String做讲解,包括String常量池的变化、String字面常量、String.intern等,以及一些常见案例。