2019独角兽企业重金招聘Python工程师标准>>>
1. 策略
- 普通人自顶向下性能调优
- 专家自底向上性能调优
2. 操作系统性能监控
- CPU
- Windows
- Task Manager(任务管理器)
- typeperf
- Linux(Solaris类似)
- System Monitor(图形化),gnome-system-monitor启动
- vmstat、mpstat
- top -p
-H,显示线程占用cpu - ps -efL | grep
,打印进程的所有线程
- Windows
- 调度队列
- Windows
- Performance Monitor
- Linux
- vmstat
- Windows
- 内存使用率
- Windows
- typeperf
- Linux
- vmstat, top, /proc/meminfo
- Windows
- 锁竞争
- Windows
- Linux
- pidstat(sysstat包), 用法:pidstat -w -I -p
,可以计算浪费的cpu时钟
- pidstat(sysstat包), 用法:pidstat -w -I -p
- 网络
- Windows
- Linux
- nicstat
- 磁盘IO
- Windows
- Linux
- iostat
- 其他
- Linux
- sar
- Linux
附: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()
...