服务端程序除了应用自己性能外,依赖与服务器自己的性能。服务器性能指标包括:CPU、内存、网络IO和磁盘使用率。
今天学习了内存监控的部分。java
当应用运行所需内存超过可用物理内存时,就会发生页面交换。一般会在硬盘上分配一个swap空间。当应用耗尽可用内存时,就会把不经常使用的内容放到swap空间里。 当访问被置换到swap空间的内容时,就须要把swap空间的内容加载到物理内存中,这种置换操做会大大影响应用的吞吐量和响应性。
JVM垃圾收集器在进行置换操做时,性能也不好。垃圾收集器为了回收不可达对象,须要大量访问内存。若是java堆的一部分被置换出去,就必须先置换进来,在扫描存活对象,这会增长GC的时间。GC会形成jvm停顿。 性能优化
[root@Hwseeker-Adx02 ~]# vmstat procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 4030152 1427780 1159168 87874912 0 0 1 15 0 0 4 1 94 0 0
其中si、so能够看到swap操做,free表明可用内存数。若是si和so很大,就表明发生了内存置换。服务器
定义几个概念
让步试上下文切换:是指线程主动释放CPU
抢占式上下文切换:线程由于分配的时间片用尽被迫放弃CPU或被优先级更高的线程抢占,而失去执行机会 网络
Java HotSpot VM从1.5开始,增长了锁机制优化。线程经过忙循环自旋尝试得到锁,若是若干次自旋后,没有获取成功,则挂起线程,等待唤醒后再次尝试获取。挂起和唤醒线程会致使让步试上线文切换。 jvm
让步试上下文切换耗费CPU时钟很是严重,一般高达80000个时钟周期
主频为3GHz的处理器每秒钟可用时钟周期为3,000,000,000 ide
[root@dmp002 ~]# pidstat -w -I -p 29064 Linux 2.6.32-573.el6.x86_64 (dmp002.tiger.local) 2018年01月25日 _x86_64_ (24 CPU) 18时34分45秒 PID cswch/s nvcswch/s Command 18时34分45秒 29064 3500 0.02 java
能够用top命令,获取pid 性能
pidstat -w显示系统每秒发生3500个上下文切换。处理器为3Ghz双核Intel CPU。所以虚拟处理器上下文切换为3500/2=1750,耗费的始终周期为1750*8000=140,000,000。3Ghz每秒钟周期数为3,000,000,000。浪费的始终周期为140,000,000/3,000,000,000=4.7%。学习
让步时钟周期占用超过3%,代表Java应用正面临锁竞争
本博文内容为《Java性能优化权威指南》的读书笔记整理而来优化