54所面经准备
文章目录
- 1.详细说一说点击一个qq.exe运行的过程
- 2.什么时候会有用户态和内核态的切换,切换过程干了什么
- 3.PCB(进程控制块)最重要的是什么?
- 4.讲解一下jmm内存模型
- 5.共享编写a++有哪些方法解决并发问题,CAS怎么实现
- 6.java中的锁,分别保证哪些并发特性
- 7.spring事务怎么用?有哪些参数
- 8.springIOC怎么理解解耦
- 9.java中线程池提交任务的流程是怎么样的
- 10.线程池的拒绝策略有哪些?
- 11.无界队列存在什么问题?一般什么场景下使用
- 12.谈谈java的锁消除和锁升级
- 13.synchronized锁可重入吗?能保证可见性吗
- 14.某个服务CPU利用率达到100%,如何排查
- 15.如果是OOM了?怎么排查?
- 16.自己用过jmap排查错误吗?
- 17.mysql是怎么解决幻读问题的?
- 18.mysql的Innodb执行引擎有哪些锁
- 19.为什么选择rabbitmq
- 20.rabbitmq的持久化是怎么做的?
- 21.线程的安全怎么保证?
- 22.进程的通信方式有哪些?
- 23.redis常用数据结构有哪些?使用场景
- 24.zset底层实现?
- 25.取出有序集合某个元素的分数,命令是什么?复杂度
1.详细说一说点击一个qq.exe运行的过程
操作系统从硬盘找到该程序,然后将程序加载到内存中,CPU通过cache和内存交互,如果需要改变数据,内存数据再持久化到磁盘即可
2.什么时候会有用户态和内核态的切换,切换过程干了什么
系统调用(访问硬件资源),硬件中断进程调度,切换过程会保存用户态现场
3.PCB(进程控制块)最重要的是什么?
PCB 是进程再操作系统的唯一标识,保存了进程的所有关键信息,最重要的是进程标识符和处理机上下文(寄存器和程序计数器),保证进程能被唯一识别
4.讲解一下jmm内存模型
jmm定义了java中多线程访问内存的规则。每个线程要修改主内存,会先写入自己的工作内存,修改后再写入主内存。比较期望值和内存值是否相同,相同则更新
5.共享编写a++有哪些方法解决并发问题,CAS怎么实现
synchronized,reentrantlock,AutomicInteger三种方式,CAS实现比较期望值和内存值是否相同,相同则更新
6.java中的锁,分别保证哪些并发特性
原子性:一个线程执行不会被打断
有序性:禁止指令重排序
可见性:一个线程对主存修改对另一个线程可见
7.spring事务怎么用?有哪些参数
通过@Transcaction注解使用
有事务传播行为参数,隔离级别,超时时间,是否只读,异常回滚策略(默认对运行时异常回滚)
8.springIOC怎么理解解耦
Spring IOC 通过“控制反转”和“依赖注入”实现了解耦。类不再自己创建依赖,而是由容器统一管理并注入,这样类只依赖接口而不是具体实现,降低了模块之间的耦合度,提高了可扩展性和可维护性。
9.java中线程池提交任务的流程是怎么样的
新来的线程小于核心线程执行,否则进行阻塞队列,阻塞队列慢,就用救急线程执行,顺便把阻塞队列的也执行完成
10.线程池的拒绝策略有哪些?
直接抛出异常,丢弃最新的任务,丢失最早的任务,交给主线程执行
11.无界队列存在什么问题?一般什么场景下使用
任务堆积导致内存溢出,一般用在任务量可控稳定下使用
12.谈谈java的锁消除和锁升级
JIT编译器会判断一个对象是否被其他线程访问,如果没有被访问,就会消除锁操作,因为没有并发安全问题。
锁升级:无锁–偏向锁–轻量级锁–重量级锁
13.synchronized锁可重入吗?能保证可见性吗
是可以重入的,会对该线程持有一个锁计数器,重入加1
14.某个服务CPU利用率达到100%,如何排查
通过top命令查看cpu的占用情况,以及top -Hp pid查看进程对应线程的占用情况,把占用最用的线程ID转换位十六进制,用jstack pid查看它下面的线程堆栈情况,分析某个线程哪行代码再重复执行
一般有写死循环,死锁,频繁垃圾回收等等
15.如果是OOM了?怎么排查?
1.提前设置好记录dump文件,OOM了导出dump文件到visualVm分析代码哪些对象创建的太多了,找到对应的代码行修改
2.jmap -heap 调整堆空间大小
16.自己用过jmap排查错误吗?
jmap -histo 查看对象的分布情况,看看OOM原因
17.mysql是怎么解决幻读问题的?
可重复读级别通过行锁+间隙锁避免幻读
或者使用串行化隔离级别
18.mysql的Innodb执行引擎有哪些锁
行锁:锁单条记录,粒度最小
间隙锁:锁定索引间隙,防止其他记录插入
next-keylock:行锁和间隙锁的组合
意向锁:用于兼容行锁和表锁,避免冲突
19.为什么选择rabbitmq
实现系统解耦,异步处理,保证消息的可靠传递(持久化,ACK,死信队列),并且容易和springboot集成
20.rabbitmq的持久化是怎么做的?
通过使用前开启durable=true开启持久化机制
21.线程的安全怎么保证?
乐观锁,悲观锁,原子类,threadlocal
22.进程的通信方式有哪些?
管道通信,共享内存,消息队列
23.redis常用数据结构有哪些?使用场景
字符串:缓存对象,计数器
哈希:存储对象属性
列表:消息会裂
集合:去重
有序集合:排行榜
Geo:地理位置
24.zset底层实现?
hash+调表,hashkey记录元素,value记录得分
跳表,按照分数排序
25.取出有序集合某个元素的分数,命令是什么?复杂度
zscore key member
时间复杂度 O(log N),因为要在跳表里按排名查找