java性能权威指南一Java性能调优工具箱


java性能权威指南一Java性能调优工具箱

前言

说来惭愧这本书是HeapDump社区,大概是23年的礼品吧,也是目前最后一本收到的技术书籍,以下是对这本书的学习笔记;

说到Java性能优化,有两个绕不开的前置条件:

  1. 关于对’不要过早优化’论点的误区
    在这个一点上,个人理解是不要过早投入精力进行极致优化,例如0.99s的响应时间,投入大量精力优化到0.49s,投入和产出不成正比;
    '过早优化’这个词语是高德纳最早提出来的,但是完整的原话是"我们不应该把大量的时间耗费在哪些小的性能改进上,过早优化是所有噩梦的根源",这不是我们编写复杂、混乱、晦涩代码的借口;

  2. 性能测试的方法
    性能测试有几个原则:

  • 测试真实应用
  • 理解批处理流逝时间、吞吐量和响应时间
    这个指的是Java应用通常都会使用JIT-即时编译技术,因此需要运行一段时间后才能测试出真实的性能水平
  • 同统计方法论应对性能变化
    就算是计算机科学这一严谨的学科,在测试过程中也会出现毛刺现象,因此我们评估应用的性能指标一定是要基于统计学来进行分析;

简单介绍过前置条件后,下面进入主菜Java性能调优工具箱一节;

性能调优工具

操作系统的工具和分析

  • CPU使用率
    性能调优的目的是提高单位时间内CPU的使用率
    常用的命令是有:
  1. vmstat [选项] [延迟时间] [次数]
  • 磁盘使用率
    目前来说磁盘读写相比CPU还是太慢太慢了,I/O阻塞是导致大部分程序性能无法提高的原因;
    常用的命令有:
  1. isstat -xm 5
    输出CPU使用情况、磁盘I/O统计信息,关键指标:%util-磁盘使用率w_await-磁盘写入时间(毫秒)%iowait-等待I/O的时间占比wMB/s-磁盘每秒写入大小
  • 网络使用率
    网络使用率类似磁盘使用率,常用的命令有:
  1. netstat:netstat -a 显示所有活动的网络连接、netstat -l 显示所有正在监听的端口,新版本的Linux中使用命令ss进行替代;
  2. nicstat 5:%Util - 网络端口使用率rKB/s 读取速度 wKB/s 写入速度

JAVA监控工具

JDK自带工具

  • jcmd
    用于打印VM的信息,

  • jconsole
    最早的JVM图形化性能监控工具

  • jhat
    读取memory dump文件

  • jinfo
    查看JVM的系统属性

  • jstack
    转储Java进程的堆栈信息

  • jstat
    提供GC和类装载活动的信息

  • jvisualvm
    监控和分析JVM性能的工具

重点的命令有:

  1. 内存转储 (Heap Dump)
    jmap -dump:format=b,file=heapdump.hprof
    jcmd GC.heap_dump /heapdump.hprof

  2. 线程转储 (Thread Dump)
    jstack > threaddump.txt
    jcmd Thread.print > threaddump.txt

性能分析工具

参考资料

为什么说过早优化是万恶之源


  TOC
 Powered by Hexo | Theme Matery   站点总字数:  208.8k  字