面试:操作系统
█ 1.查看内存
查看CPU的核数:System.out.println(Runtime.getRuntime().availableProcessors());
查看java虚拟机中的内存总量:Runtime.getRuntime().totalMemory();
虚拟机试图使用的最大内存量:Runtime.getRuntime().maxMemory();
█ 2.Linux命令:
1)整机:top
load average 系统平均负载,,,1 5 15mins 这三个值相加/3>60%系统压力大
且如果不停的按1 就可以看几核cpu
uptime精简版
2)cpu:vmstat -n 2 3
每两秒采样一次 共3次 ,,, us sy>80%cpu不足
mpstat -P ALL 2
所有cpu核的情况 每2秒采样一次 。其中idle值越高越好,低于60压力大
pidstat -u 1 -p ps号
每个进程使用cpu的用量分解信息
3)内存:free -m
兆 -g
pidstat -p 进程号 -r 采样间隔s
4)硬盘:df -h
查看磁盘剩余
5)磁盘IO:iostat -xdk 2 3
看最后的util--一秒钟有%的时间用于IO操作。100%满了
pidstat -d 采样间隔s -p 进程号
6)网络IO:ifstat -a
监控网络 有可能需要下载
█ 3.生产环境服务器变慢,诊断思路和性能评估
微服务调优
启动的时候 加参数java -server -Xm1024m -Xmx1024m -XX:+UserG1GC -jar xxx.war
jinfo -flags 7900
jmap内存映像工具
jstat统计信息监视工具
○ 3.1 cpu占用过高,分析思路 定位
结合Linux和JDK命令一块分析
1)先用top命令找出CPU占比最高的
2)ps -ef|grep java|grep -v grep
或者 jps -l
进一步定位,得知是什么样的后台程序
3)定位到具体线程或者代码 ps -mp 进程号 -o THREAD,tid,time
对应的是线程
4)将需要的 线程ID 转换成16进制格式 printf ,,%x\n,, 转换16进制的线程ID(小写)
5)jstack 进程ID/grep 16进制tid -A60
找到了错误代码
1. 内存碎片
内存碎片分为:内部碎片和外部碎片。
内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;
内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。
单道连续分配只有内部碎片。多道固定连续分配既有内部碎片,又有外部碎片。
外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。
外部碎片是出于任何已分配区域或页面外部的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。
使用伙伴系统算法。
2. 页式存储
主存被等分成大小相等的片,称为主存块,又称为实页。
当一个用户程序装入内存时,以页面为单位进行分配。页面的大小是为2n ,通常为1KB、2KB、2n KB等