监控系统内存相关属性
- 页面调度
- 页面交换
- 加锁
- 线程迁移让步式
- 抢占式上下文切换
(待完善vmstat监控页面交换)
页面交换对JVM影响
问题:
系统进行页面交换或使用虚拟内存,JVM会表现明显的性能问题。
原因:
应用运行所需要的内存超过可用物理内存,会发生页面交换。JVM垃圾收集器为了回收不可达对象所占用的空间,需要访问大量的内存,如果Java堆一部分被置换出去了,就必须先置换进内存以便垃圾回收期扫描存活对象,这回增加垃圾收集的持续时间。引起JVM长时间停顿。
vmstat监控页面交换
swap
si:交换进内存
so:交换出内存
下图未进行页面交换
下图进行内存交换
空闲内存开始减少,si及so没有什么变化,当155000左右,so开始增加,慢慢si也开始增加。io项目同样有写block变化
通常说明系统中有应用或是一组应用进行大量内存分配或是内存访问。当物理内存耗尽系统开始将最近最少使用的内存置换到虚拟内存。
监控锁竞争
让步式上下文切换:执行线程主动释放CPU
抢占式上下文切换:线程因为分配的时间片用尽而被迫放弃CPU或是被其他优先级更高的线程所抢占。
让步式上下文切换
Linux系统上使用sysstat包中的pidstat命令监控锁竞争(kernel版本高于2.6.23)
pidstat -w结果中cswch/s是让步式上下文切换。(每秒)
计算规则:
pidstat -w是所有虚拟处理器的让步式上下文切换。让步式上下文切换数乘以80000,除以CPU每秒的时钟周期,可以得出让步式上下文切换所耗费的CPU时钟周期百分比。
pidstat -w每5秒监控进程的Java应用。
3500/2*80000/3000000000=4.7%(除2是因为两个CPU)
基准值:3-5%或更多时钟周期,说明Java应用正面临锁竞争。