你的位置:首页 > Java教程

[Java教程]Java性能优化权威指南


一:CPU

1. 用户态CPU是指执行应用程序代码的时间占总CPU时间的百分比。

系统态CPU是指应用执行操作系统调用的时间占总CPU时间的百分比。系统态CPU高意味着共享资源有竞争或者I/O设备之间有大量的交互。

提高应用性能和扩展性的一个目标就是尽可能降低系统态CPU使用率。

2. CPU运行队列就是那些已经准备好运行、正等待可用CPU的轻量级进程。

当运行队列长度达到处理器的4被或者更多时,系统的相应就非常迟缓了。

解决运行队列长有两种办法:

1). 增加CPU以分担负载;

2). 分析系统中运行的应用,改进CPU使用率;

1. vmstat

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b  swpd  free  buff cache  si  so  bi  bo  in  cs us sy id wa st 2 0   0 104956  868 825812  0  0   1   5  16  25 0 0 100 0 0

r:CPU运行队列长度,值是运行队列中轻量级进程的实际数量

us:用户态CPU使用率

sy:系统态CPU使用率

id:CPU空闲率

2. top

top - 09:42:04 up 3 days, 3 min, 1 user, load average: 0.00, 0.01, 0.05Tasks: 108 total,  3 running, 105 sleeping,  0 stopped,  0 zombie%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 stKiB Mem : 1015472 total,  104568 free,  84224 used,  826680 buff/cacheKiB Swap:    0 total,    0 free,    0 used.  727760 avail Mem  PID USER   PR NI  VIRT  RES  SHR S %CPU %MEM   TIME+ COMMAND                                              784 root   20  0 553064 16340  5748 S 0.0 1.6  0:21.48 tuned                                               743 root   20  0 110512 13140  676 S 0.0 1.3  0:00.13 dhclient                                             9678 polkitd  20  0 527456 13128  4680 S 0.0 1.3  0:00.09 polkitd                                               1 root   20  0  43684  6176  3804 S 0.0 0.6  0:05.08 systemd                                             

上半部分是整个系统的统计信息,下半部分是进程的统计信息。

二:内存

1. 系统在使用页面交换或虚拟内存时,访问swap中内存以及JVM垃圾回收swap中内存时,都存在内存置换(从swap中置换到内存),性能肯定有问题;

2. 锁竞争,一般来说让步时钟周期占用3%—5%或更多,说明java应用正面临锁竞争;

vmstat

free:可用空闲内存;

si:内存页面换入;

so:内存页面换出;

pidstat

[test ~]$ pidstat -w -I -p 7938 5Linux 3.10.0-229.20.1.el7.x86_64 (test) 	11/13/2016 	_x86_64_	(1 CPU)07:56:42 PM  UID    PID   cswch/s   nvcswch/s Command07:56:47 PM   0   7938   3500.00   0.00 java07:56:52 PM   0   7938   3500.00   0.00 java07:56:57 PM   0   7938   3500.00   0.00 javaAverage:    0   7938   3500.00   0.00 java

cswch/s:让步式上下文切换;

例如:处理器为3.0GHz双核,每个处理器上下文切换3500/2=1750,耗费的时钟周期1750*80000=140000000,因此上下文切换所占比例为:140000000/3000000000=4.7

三:网络

分布式Java应用的性能和扩展性受限于网络带宽或网络I/O的性能。

nicstat

需要编译安装(https://blogs.oracle.com/timc/tags/linux)

  Time   Int  rKB/s  wKB/s  rPk/s  wPk/s  rAvs  wAvs %Util  Sat13:25:57   eth0  2.34  1.77  2.84  2.29  842.6  789.6 0.00  0.0013:25:57    lo  0.00  0.00  0.00  0.00  85.49  85.49 0.00  0.00

Int:网络接口设备名

rKb/s:每秒读取的KB数

wKb/s:每秒写入的KB数

%Util:网络使用率

Sat:饱和度

四:磁盘

iostat

[test ~]$ iostat -