Java性能监控与调优(JVM、GC...) 更新ing

Java性能监控与调优

一、内容介绍

1.1 内容介绍

  • Java性能监控与调优在开发环境中我们一般都用不到,但是在生产环境中却尤为重要,原因有如下:

    1. 生产环境比较复杂
    2. 生产环境出现问题不好进行定位

    所以说对监控来说是非常重要。

  • 以前的情况:

    1. 可能多少有些了解
    2. 没有系统的学习过原理
    3. 没有上手实践过
  • 会帮你迈过哪些坎?

    1. 生产环境发生了内存溢出该如何处理?
    2. 生产环境应该给服务器分配多少内存合适?
    3. 如何对垃圾收集器的性能进行调优?
    4. 生产环境CPU负载飙高该如何处理?
    5. 生产环境应该给内存分配多少线程合适?
    6. 不加log如何确定请求是否执行了某一行代码?
    7. 不加log如何实时查看某个方法的入参和返回值?
    8. JVM的字节码是什么东西?
    9. 循坏体中做字符串+拼接为什么效率低?
    10. 字符串+拼接一定就是StringBuilder.append吗?
    11. String常量池是咋回事?
    12. 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类型:
      在这里插入图片描述
  • Xmx -Xms:

    • 不是X参数,而是XX参数
    • -Xms等价于-XX:InitialHeapSize
    • -Xmx等价于-XX:MaxHeapSize

2.2 查看JVM运行时参数

  • 图示:
    在这里插入图片描述
    在这里插入图片描述

  • PrintFlagsFinal:

    • 图示:
      在这里插入图片描述
    • 其中: =表示默认值,:=被用户或者JVM修改后的值
  • jvm的常用工具:

    1. jps将打印所有正在运行的 Java 进程。
    2. jstat允许用户查看目标 Java 进程的类加载、即时编译以及垃圾回收相关的信息。它常
      用于检测垃圾回收问题以及内存泄漏问题。
    3. jmap允许用户统计目标 Java 进程的堆中存放的 Java 对象,并将它们导出成二进制文
      件。
    4. jinfo将打印目标 Java 进程的配置参数,并能够改动其中 manageabe 的参数。
    5. jstack将打印目标 Java 进程中各个线程的栈轨迹、线程状态、锁状况等信息。它还将
      自动检测死锁。
    6. 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等,以及一些常见案例。

8.1 jvm字节码指令

8.2 i++与++i

8.3 字符串+拼接

8.4 Try-Finally字节码

8.5 String Constant Variable

8.6 常用代码优化方法

猜你喜欢

转载自blog.csdn.net/qq_37128049/article/details/117173591