《Java性能优化权威指南》读书笔记(一)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1. 策略

  • 普通人自顶向下性能调优
  • 专家自底向上性能调优

2. 操作系统性能监控

  • CPU
    • Windows
      • Task Manager(任务管理器)
      • typeperf
    • Linux(Solaris类似)
      • System Monitor(图形化),gnome-system-monitor启动
      • vmstat、mpstat
      • top -p -H,显示线程占用cpu
      • ps -efL | grep ,打印进程的所有线程
  • 调度队列
    • Windows
      • Performance Monitor
    • Linux
      • vmstat
  • 内存使用率
    • Windows
      • typeperf
    • Linux
      • vmstat, top, /proc/meminfo
  • 锁竞争
    • Windows
    • Linux
      • pidstat(sysstat包), 用法:pidstat -w -I -p ,可以计算浪费的cpu时钟
  • 网络
    • Windows
    • Linux
      • nicstat
  • 磁盘IO
    • Windows
    • Linux
      • iostat
  • 其他
    • Linux
      • sar

附:vmstat详解

// r等待运行的进程队列、b阻塞的进程
// swpd虚拟内存使用、空闲内存、buffer的内存(一般放权限目录信息)、缓存(一般指文件)
// si,从磁盘进入交换区间的内存使用量,so,从交换区间写入磁盘的内存使用量
// bi,每秒写入的块数量,block/s,bo,每秒读取的块数量,如果不等于0,可能是io频繁。
// in,每秒cpu中断次数,cs,每秒上下文切换次数
// us用户态cpu、sy系统态cpu、id空闲cpu
[fua@localhost ~]$ vmstat 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1790504  52728 528848    0    0    46    18  250  472 11  1 87  2  0	
 3  0      0 1790568  52736 528840    0    0     0    10  941 1454 11  0 84  4  0	

3. JVM概览

  • VM运行时(Runtime)
    • 命令行参数
      • 标准
      • 非标准:-X
      • 非稳定:-XX
      • 开关,+(true)、-(false)
    • 生命周期
  • 垃圾采集器(分代垃圾回收)
    • Serial、Parallel、Concurrent Mark-Sweep GC、Garbage First
  • JIT编译器(JIT Compiler)
  • 内存管理(Memory Manager)

4. JVM性能监控

参数类

  • -XX:+PrintGCDetails,打印垃圾回收信息
// Full GC格式如下:
[Full GC (System) 2.260: [CMS: 0K->19851K(9437184K), 0.2133210 secs] 2157185K->19851K(13032320K), [CMS Perm : 21967K->21952K(524288K)], 0.2134350 secs] [Times: user=0.24 sys=0.06, real=0.22 secs]
// 注:带有System字样,表示是主动调用System.gc()引起的
// Minor GC格式如下:
[GC 50.941: [ParNew: 1048576K->46474K(1310720K), 0.0330730 secs] 1067646K-65544K(6029312K), 0.0331840 secs] [Times: user=0.35 sys=0.04, real=0.04 secs]
// CMS日志
  • -Xloggc:,gc日志输出到指定目录
  • -XX:+PrintGCApplicationConcurrentTime:打印应用并行时间
  • -XX:+PrintGCApplicationStoppedTime:打印应用停止时间
  • -XX:+PrintCompilation:监控HotSpot JIT编译器

工具类

  • GCHisto
  • JConsole
  • VisualGC(VisualVM插件)
  • VisualVM

jstack用于分析锁竞争,多个线程查找相同的锁地址,抓取多份,如果在同一个锁上持续竞争,说明应用存在高度锁竞争

5. Java应用性能分析

这章是工具的使用说明书,从下载到安装使用,进行了详细的介绍。没有具体使用过,只记录下的名称。应用性能分析,个人觉得,使用Visual VM就足够了

  • Oracle Solaris Studio Persformance Analyser
    • 支持Solaris和Linux
  • NetBeans Profiler
    • 支持Solaris、Windows、Linux、Mac OS X

6. Java应用性能分析技巧

介绍了使用Oracle Studio Performance Analyzer的优化技巧

优化方向:

  • 更高效的算法

  • 减少锁竞争

  • 为算法生成更有效率的代码

    • 调整数据结构大小,list或者collection
  • 使用NIO框架:Grizzly、MINA

  • 大量的线程上下文切换是潜在锁竞争的征兆

    • 缩小锁的范围,减少等待CPU周期,争取更多CPU
    • HashMap -> ConcurrentHashMap -> ThreadLocal
  • volatile保证线程和CPU缓存中数据同步

    • 出现volatile字段增加CPU指令,出发CPU缓存更新
    • 频繁更新可能会产生性能问题,减少volatile的写
  • StringBuffer或StringBuilder默认是长度16,不够用自动2倍扩展,如果需要的比较多,最好初始化指定长度。

  • HashMap默认是16,负载因子是0.75,即12,代码中如果可以预估hashmap的大小,最好初始化指定大小,减少扩展消耗。其他容器类似。

  • 增加并行性

//int number = System.availableProcessors()
int number = Runtime.getRuntime().availableProcessors();
ExecutorService pool = Executors.newFixdThreadPool(number);
Future<> future = pool.submit(xxx)
// future.get()
...

转载于:https://my.oschina.net/serverx/blog/704677

你可能感兴趣的:(java,操作系统,运维)