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