吊打面试官系列
2022-03-06 13:18:25 0 举报
AI智能生成
Java面试
作者其他创作
大纲/内容
Java基础
集合
HashMap
1.7
数组+链表
头插
1.8
数组+链表+红黑树
尾插
扩容机制
负载因子默认0.75
创建一个空数组重新Hash
2的幂次
方便位运算
均匀分布
初始化容量16,即数组的大小
线程不安全
ConcurrentHashMap
线程安全
1.7
数组+链表
segment分段锁
继承RenntrantLock
尝试获取锁,存在并发竞争 自旋 阻塞
get()方法高效
volatile 修饰,不需要加锁
1.8
数组+链表+红黑树
CAS+synchronized
cas失败 自旋保证成功
再失败,由sync保证
ArrayList
LinkedList
多线程
synchronized
方法
ACC_SYNCHRONIZED
特征保证
有序性
as-if-serial
happens-before
可见性
内存强制刷新
原子性
单一线程持有
可重入性
计数器
对象
对象头header
Mark Word
存储对象的hashcode,分代年龄和锁标志位
Klass Point
对象指向它类的元数据的指针,虚拟机通过这个指针来确定这个实例对象
Monitor
EntryList
Owner
会指向持有Monitor对象的线程
WaitSet
实例数据
对其填充
代码块
monitorenter
monitorexit
程序计数器 count
加减
锁膨胀
无锁状态->偏向锁->轻量级锁(乐观锁)->重量级锁
锁升级的过程,锁状态不可逆
lock和sync的区别
sync是JVM层面的关键字,Lock是一个JDK层面的接口,提供更多高级的特性
sync是自动释放锁,Lock必须手动释放锁
sync可以锁方法和代码块,Lock只能锁代码块
Lock可以中断,sync不行
sync是非公平锁,Lock可以指定公平
缺陷: 锁升级的过程不可逆
Lock
ReentrantLock
AQS
非公平锁
公平锁
ReentrantReadWriteLock
ReadLock
WriteLock
StampedLock
ThreadLocal
内存泄漏问题
Volatile
可见性
原子性
JMM
线程池
核心参数
常驻核心线程数
最大线程数
空闲时间&时间单位
缓冲队列
LinkedBlokingQueue
无界队列
OOM问题
ArrayBlockingQueue
有界队列
Synchronous
工厂方法
拒绝策略
抛异常
丢弃
丢弃最早提交的还没被执行的任务
重试
线程池实现
new FixThreadPool
new SingleThreadPool
new CacheThreadPool
new ScThreadPool
Spring封装的线程池-ThreadPoolTaskExecutor
运行机制
核心线程->队列->最大线程->拒绝策略
运行状态
有个volatile的状态码
running
shutdown
stop
terminated
线程间通讯方式
Synchronized的wait/notify机制
ReentrantLock的condition方式
闭锁方式
CountDownLatch
lock.countDown()
lock.await()
栅栏方式
CyclicBarrier
barrier.await()
barrier.reset()
信号量方式
Semaphore
acquire
release
管道通信
java.io.PipedInputStream
java.io.PipedOutputStream
线程属性
优先级
守护线程
join
interrupt
sleep
wait
ThreadGroup
锁
是否锁住同步资源
悲观锁
乐观锁
多个线程竞争锁是否要排队
排队
公平锁
不排队
非公平锁
锁级别
无锁
不锁柱同步资源,多个线程中只有一个能修改资源成功,其它会重试
偏向锁
同一个线程执行同步资源时,自动获取资源
轻量级锁
多个线程竞争同步资源时,没有获取锁的线程自旋,等待锁释放
重量级锁
多个线程竞争同步资源时,没有获取锁的线程阻塞,等待唤醒
其它
自旋锁
可重入锁
排他锁/共享锁
互斥锁/读写锁
分段锁
并发与并行的区别
并行:同一时刻处理事情的能力
并发:单位时间内处理事情的能力
进程和线程的区别
进程:程序运行时 资源分配的最小单位 一个进程有多个线程
线程:CPU调度的最小单位
JVM
运行时数据区
线程共享
方法区(也叫永久代)
堆
新生代
Eden区
S1
S2
老年代
线程私有
栈
本地变量表
操作数栈
程序计数器
本地方法栈
类加载机制
加载->验证->准备->解析->初始化->使用->卸载
双亲委派机制
垃圾回收机制
垃圾回收算法
标记清除
适用场景
对象存活比较多的时候
老年代
缺陷
造成内存碎片
扫描两次
标记存活对象
清除没有标记的对象
提前gc
标记整理
分代收集
垃圾回收器
CMS
分代
年轻代
Eden区
From Survivor
To Survivor
minor gc
老年代
full gc
老年代写满
永久区空间不足
永久区
标记复制
适用场景
存活对象少的时候,比较高效
适合年轻代
扫描了整个空间,标记存活对象并复制移动
缺陷
需要空闲空间
需要先复制移动对象
G1
标记整理
回收模式
young gc
回收Eden区,复制一些对象到old区
full gc
回收步骤
初始标记
stw 从gc root直接可达的对象
并发标记
根据可达性分析,找出存活对象
最终标记
筛选回收
JVM如何判断是否为可回收对象
引用计数法
无法回收存在循环引用的对象
可达性分析
gc root
栈中的对象
static修饰的对象
常量
JVM调优
OOM
1.一般生产系统中都会设置当系统发生OOM时,生成即时的dump文件
2.我们可以使用jsisualvm等工具来分析dump文件
3.根据dump文件找到找到异常的实例对象和异常的线程(占用CPU高),定位到具体代码
4.然后进行详细的分析和调试
2.我们可以使用jsisualvm等工具来分析dump文件
3.根据dump文件找到找到异常的实例对象和异常的线程(占用CPU高),定位到具体代码
4.然后进行详细的分析和调试
内存泄漏
线程死锁
CPU占用率高
top命令查看cpu占用率最高的进程
top -Hp 进程ID 命令查看进程中cpu占有率最高的线程
转化线程ID为十六进制
jstack 进程ID | grep 十六进制的线程ID 定位出现问题的具体代码位置
JVM性能检测工具
jconsole
jvisualvm
MAT
内存泄漏
CPU100%
Spring
IOC
依赖注入
控制反转
Bean
生命周期
作用域
单例
多例
request
session
AOP
相关术语
Aspect
Join point
Advice
Point cut
Target
Proxy
Weaving
静态代理
实现类
动态代理
JDK动态代理
Cglib
spring事务
传播行为
REQUIRED
SUPPPRTS
MANDATORY
REQUIRED_NEW
NO_SUPPPRTED
NEVER
NESTED
隔离级别
ISOlATION_DEFAULT
使用mysql数据库默认的隔离级别
READ_UNCOMMITTED
最低的隔离级别,允许读取尚未提交的数据变更,可能导致脏读、幻读或不可重复读
READ_COMMITTED
允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
REPEATABLE_READ
对同一字段多次读取结果都是一致的,除非数据是本身事务自己修改,可以阻止脏读和不可重复读,但幻读仍有可能发生
SERIALIZABLE
最高隔离级别,完全服从ACID的隔离级别,确保阻止脏读、不可重复读以及幻读,也是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现
循环依赖
三级缓存
去单例池拿
判断是否正在被创建
判断是否支持循环依赖
二级缓存放到三级缓存
干掉二级缓存
GC
下次再来直接三级缓存拿缓存
缓存 存放
一级缓存 单例Bean
二级缓存 工厂产生Bean
三级缓存 半成品
事务实现原理
采用不同连接器
用aop建立一个链接 - 共享链接
ThreadLocal 当前事务
前提是关闭AutoCommit
类加载机制
过程
加载
生成一个class对象
验证
文件格式验证
元数据验证
字节码验证
符号引用验证
准备
默认值
static关键字修饰的会分配内存
解析
解析具体类的信息
引用等
初始化
父类没初始化 先初始化父类
使用
卸载
destory()方法
加载方式
main()
class,forName
ClassLoader,loadClass
双亲委派机制
可以避免重复加载
安全
微服务
springcloud
dubbo+zk
dubbo
默认NIO 单一长连接
二进制系列化 小数据量 100k
数据量中等,不适合文件传输
Zookeeper
选举机制
过半机制
预提交 ack 2pc
协议
memcached
redis
webService
http
google guaua localcache
分布式
redis
数据结构
string
hash
set
zset
底层数据结构是跳表
list
bitmap
底层
SDS动态字符串
保存键值
aof缓存区
记录本身长度
修改字符减少内存重新分配
空间预分配
惰性空间释放
二进制安全
链表
保存多个客户端状态
列表的订阅发布 慢查询 监听器
字典
hash 表
hash表节点
hash算法 索引值
渐进式 rehash
每个字典 两个hash表
压缩列表
整数集合
常见的命令
keys
setnx
expire
高可用
持久化
数据同步机制
哨兵
集群
链表
多主
横向扩容
分片
常见的问题
缓存雪崩
随机设置key失效时间
集群部署
缓存预热
缓存穿透
布隆过滤器
增加接口校验
缓存击穿
互斥锁
热点数据永不过期
缓存与DB双写一致性
延时双删
并发竞争
大key
big key命令找到 干掉
redis 4.0引入了memory usage命令和lazyfree机制
热点key
缓存时间不失效
多级缓存
布隆过滤器
读写分离
过期策略
定时删除
耗cpu
创建一个定时器
惰性删除
耗内存,因为可能存在大量的没有用的key没有及时删除
定期删除
检查 删除 但是是随机的删除
淘汰机制
FIFO
删除最早的key,先进先出
LFU
最不经常使用
LRU
最近最少使用
高可用方案
主从+哨兵+集群
mq
RocketMQ
NameServer
无状态模式
borker向注册中心发送心跳,顺便带上所有的topic信息
早期是zk,后面改了成NameServer
RabbitMQ
Kafka
es
mongdb
MySQL
事务隔离级别
索引
MVCC
版本链 在聚簇索引中,有两个隐藏列 trx_id roll_pointer
读未提交
直接读取最新版本
序列化
加锁
ReadView
读已提交
每次读取前生成一个
可重复读
第一次生成一个
锁
全局表
锁住整张表,全库逻辑备份
表锁
读锁不互斥,写锁互斥
lock table read/write
行锁
热点行
死锁消耗CPU
控制并发度
分治
死锁
超时时间-innodb_lock_wait_timeout
死锁机制 事务回滚-innodb_dead_wait_detect = on
需要加的时候才加上锁,并不是马上释放,等事务结束才释放 两阶段锁协议
间隙锁
读写锁
读锁
for update
lock in share mode
行锁
写锁
innodb如何加锁
Record Lock 对索引加锁
Gap Lock 对索引项之间的'间隙',第一条记录前的间隙,或最后一条后的间隙 加锁
Next-Key前两种的组合,对记录以及前面的间隙加锁
B+Tree
log
undo log
redo log
bin log
两阶段提交 redo log准备 binlog提交
主备延迟
强制走主
sleep
23种设计模式
- 单例
- 工厂
- 代理
- 模板方法
- 观察者
- 适配器
- 责任链
- 建造者
算法
- 排序
- 查找
- 贪心
- 分治
- 动态规划
- 回溯
数据结构
0 条评论
下一页