面试:操作系统

█ 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等







posted @ 2021-03-26 12:47  千面鬼手大人  阅读(43)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css