java面试题:Linux
Q:Linux怎么查端口?端口被占用怎么办?
netstat -ntulp | grep 2181//查看2181端口号
netstat -pan | grep 2181 //查看2181端口号
如下所示,其中的PID是进程号。
[root@localhost bin]# netstat -pan | grep 2181
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::2181 :::* LISTEN 7839/java
也可以使用以下命令:
lsof -i:2181 //查看2181端口占用
[root@localhost bin]# lsof -i:2181
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 7839 root 26u IPv6 85064 0t0 TCP *:eforward (LISTEN)
通过以上命令得到了端口对应的进程7839后,可以使用ps查看进程的使用情况。
ps -aux | grep 7839 //查看7839进程的使用情况
[root@localhost bin]# ps -aux | grep 7839
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 7839 0.1 2.7 3296832 51860 ? Sl 03:39 0:45 /usr/local/zookeeper-3.4.13/bin/../conf/zoo.cfg
就可以知道2181端口是被哪个程序占用了,然后判断是否使用KILL命令干掉。
Q:Linux怎么查看Tomcat端口号?
步骤跟上面的相反,先得到进程号PID,再根据PID去查看端口号
ps -ef|grep tomcat
假设查到的进程号为5772,那么如下根据进程号查端口号:
netstat -anop |grep 5772
Q:Linux怎么查看进程号pid相关的信息?
ps -ef| grep 进程号
Q:Linux怎么查看日志?
cat filename | tail -n +3000 | head -n 1000 从第3000行开始,显示1000行。即显示3000~3999行
cat filename| head -n 3000 | tail -n +1000 显示1000行到3000行
cat -n filename |grep "关键字"
cat filename | grep -C 5 '关键字' (显示日志里匹配字串那行以及前后5行)
cat filename | grep -B 5 '关键字' (显示匹配字串及前5行)
cat filename | grep -A 5 '关键字' (显示匹配字串及后5行)
也可以用vim打开后,使用/关键字匹配。
Q:Linux如何找到 java 程序 CPU 使用率100%的原因?
1.用top 命令查看占用资源最多PID(进程):
如 pid 为 1000;
2.再用 top -H -p 1000 命令查看在这个进程中,消耗 cpu 最多 的线程,如 1003;
3. 最后使用 jstack 1000 > dump_file 把这个进程的堆栈信息 dump 到文件中,
4.打开 dump_file,找到 id 为1003的线程(要用printf %x 转化为16进制),就能发现是哪个方法占用了 cpu,分析自己的代码
Q:Linux怎么查看IO负载?
iostat -x
详情见: https://blog.csdn.net/weixin_38428439/article/details/121525172
Q:有没有用过jstack?怎么排查线上问题?说出排查线上问题的一个完整过程以及相关的Linux命令。
待补充。
操作系统
Q:什么是死锁?
Q:死锁的四个必要条件是什么?
1、互斥条件:一个资源每次只能被一个进程使用;
2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;
3、不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺;
4、循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系;
Q:如何解决死锁?
-
预防死锁:
资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
(1)以确定的顺序获得锁
如果必须获取多个锁,那么在设计的时候需要充分考虑不同线程之前获得锁的顺序。按照上面的例子,两个线程获得锁的时序图如下:
如果此时把获得锁的时序改成:
那么死锁就永远不会发生。 针对两个特定的锁,开发者可以尝试按照锁对象的hashCode值大小的顺序,分别获得两个锁,这样锁总是会以特定的顺序获得锁,那么死锁也不会发生。问题变得更加复杂一些,如果此时有多个线程,都在竞争不同的锁,简单按照锁对象的hashCode进行排序(单纯按照hashCode顺序排序会出现“环路等待”),可能就无法满足要求了,这个时候开发者可以使用银行家算法,所有的锁都按照特定的顺序获取,同样可以防止死锁的发生,该算法在这里就不再赘述了,有兴趣的可以自行了解一下。
(2)超时放弃
当使用synchronized关键词提供的内置锁时,只要线程没有获得锁,那么就会永远等待下去,然而Lock接口提供了boolean tryLock(long time, TimeUnit unit) throws InterruptedException方法,该方法可以按照固定时长等待锁,因此线程可以在获取锁超时以后,主动释放之前已经获得的所有的锁。通过这种方式,也可以很有效地避免死锁。 还是按照之前的例子,时序图如下: -
避免死锁:
预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得 较满意的系统性能。由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全的状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。
银行家算法:首先需要定义状态和安全状态的概念。系统的状态是当前给进程分配的资源情况。因此,状态包含两个向量Resource(系统中每种资源的总量)和Available(未分配给进程的每种资源的总量)及两个矩阵Claim(表示进程对资源的需求)和Allocation(表示当前分配给进程的资源)。安全状态是指至少有一个资源分配序列不会导致死锁。当进程请求一组资源时,假设同意该请求,从而改变了系统的状态,然后确定其结果是否还处于安全状态。如果是,同意这个请求;如果不是,阻塞该进程知道同意该请求后系统状态仍然是安全的。 -
检测死锁
首先为每个进程和每个资源指定一个唯一的号码;然后建立资源分配表和进程等待表。 -
解除死锁:
当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:
剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。
参考资料:https://blog.csdn.net/hd12370/article/details/82814348
参考资料:
https://blog.csdn.net/hanner_cheung/article/details/6081440
https://www.runoob.com/linux/linux-command-manual.html
https://man7.org/linux/man-pages/dir_section_1.html