高级JAVA面试总结
2023-08-18 17:50:00 2 举报
AI智能生成
高级Java面试总结的思维导图如下: 思维导图是以中心主题"高级Java面试总结"为中心,分为三个主要分支。 第一个主分支是“核心Java”,其中包含了Java基础和高级特性。Java基础包括数据类型、运算符、控制语句等基本概念,高级特性包括多线程、集合框架、IO操作等。在面试中,核心Java是必不可少的部分, 面试官通常会考察候选人在这方面的知识。 第二个主分支是“框架与技术”,其中包括了Spring框架、Hibernate、MyBatis等常用Java框架;还有Web开发技术如Servlet、JSP、MVC等。对于一个高级Java开发者而言,熟悉并掌握这些框架和技术是非常重要的。 第三个主分支是“面试准备与技巧”,其中包括了准备面试的重要环节如简历中的准备、面试前的准备等;还有面试技巧如面试表现、回答问题的技巧等。这个分支可以帮助候选人提高面试的成功率。 通过这个思维导图,候选人可以全面了解高级Java面试的范围和重点,有针对性地进行准备。同时,这个思维导图也可以帮助候选人整理思路,做到有条不紊地对面试所需的知识进行学习和复习,提高应试能力。
作者其他创作
大纲/内容
JAVA
<b>【腾讯文档】㊙️各大公司部门作息表<br>https://docs.qq.com/sheet/DS3ZiRm5EYVZmdHBm</b>
ConcurrentHashMap
分段锁机制
put实现:通过CAS插入数据
synchronized锁
锁膨胀过程(JDK1.6以后)
偏向锁
Markword文件记录了当前线程ID和可偏向状态
只CAS一次,单线程重入时判断线程ID是否一致
如果线程ID不一致:存在多线程竞争,升级轻量级锁
轻量级锁
CAS竞争,默认自旋10次
JVM智能自适应自旋
CAS自旋竞争失败,升级重量级锁
重量级锁(互斥锁)
依赖monitor锁->依赖操作系统互斥锁
记录Mutex互斥量,线程阻塞
多线程
ThreadLocal
每个线程持有一个ThreadLocalMap对象
内存泄漏问题
ThreadLocal是一个弱引用,当为null时会被gc掉
ThreadLocalMap生命周期和Thread的一样,它不会回收
使用完执行remove操作
线程池
核心线程、最大线程、等待队列、拒绝策略
上下文切换开销<br>
第一个进程的暂停和第二个进程的调度要求内核存储第一个进程的状态并加载第二个进程的状态
操作系统需要保存和恢复相应的进度信息,这个进度信息就是上下文
JVM
内存模型
堆(放对象)
方法区(直接内存):常量,静态变量,类元信息
栈(放变量)
本地方法栈
程序计数器
调优
JVM参数
分析1分钟内YGC、FGC频率
根据实际运行平均消耗内存设置Xms和Xmx大小
高并发的情况:survivor未触发15次就到达老年代
垃圾回收器
标记-整理:追求高吞吐量,减少内存碎片
标记-清除:追求响应速度
Spring
Bean启动过程
循环依赖问题(三级缓存)
1.创建A的代理工厂,放入三级缓存,暴露早期引用
2.解析依赖B,触发B的创建,流程与上一步一样
3.B执行代理工厂方法,创建A的代理对象,放入二级缓存,同时从三级缓存移除A的代理工厂
4.B完成实例化,放入一级缓存
5.A从二级缓存移除早期A的代理对象,并写入一级缓存,实例化完成
MVC
请求过程
SpringBoot
约定大于配置
简化配置,减轻架构师工作
Conditional自动装配
自定义配置
AOP
jdk动态代理
生成一个实现代理接口的匿名类
cglib
修改其字节码生成子类
因为是继承,所以不能声明final
Mysql
2个常用存储引擎
InnoDB(默认)<br>
支持事务
不支持全文索引
支持MVCC(解决幻读问题)
MyISAM<br>
不支持事务
支持全文索引
2种常用索引结构
B+树(默认,多路平衡树)
时间复杂度:O(logN)
相对平衡二叉树,B+树减少树的高度,节省查询次数
相对B树,B+树数据只存在子节点
每个叶子节点都有一个指针,指向下一个数据,形成一个有序链表
哈希
不能范围查询
聚集索引、非聚集索引
聚集索引(主键)
逻辑顺序与磁盘上的物理存储顺序一致(字典里的拼音索引)
默认使用主键;没定义主键:使用第一个唯一非空索引;没有索引:使用隐式定义单调自增主键
进行排序会非常损耗磁盘IO
非聚集索引
逻辑顺序与磁盘上的物理存储顺序不同(字典里的偏旁索引),可定义多个
返回列超出定义范围,需要通过聚集索引二次查询
条件匹配第一个索引字段才生效
4种事务隔离级别
读未提交
脏读,基本不用
读已提交(非mysql默认)
多数数据库默认的隔离级别
互联网项目使用
可重复读(mysql默认)
历史原因:兼容5.0之前binlog主从复制statement执行顺序不一致的BUG
幻读问题
MVCC控制
存在间隙锁,死锁几率大
可串行化
最高隔离级别,读操作加锁,mysql自带分布式事务才使用
强一致性事务场景
可能导致大量的超时现象和锁竞争
集群
binlog主从复制
Redis
特性(速度快)
运行在内存中
数据结构简单,操作节省时间
采用了IO多路复用阻塞机制
单线程版本:节省内核上下文切换开销,CPU利用率高
应用场景
分布式:热点数据缓存、分布式锁、简单消息队列
五大数据结构
string、list、map、set、zset
zset跳跃链表
单链表+多级索引结构
有序集合在节点元素较大或者元素数量较多时使用跳跃表
key插入时随机确定1-32的level值
由 zskiplist和 zskiplistnode两个结构组成,其中 zskiplist用于保存跳跃表信息(比如表头节点、表尾节点、长度),而zskiplistnode则用于表示跳跃表节点
与红黑树相比
跳跃链表时间复杂度平均O(logN),最坏O(N),红黑树近似O(logN)
跳跃链表比红黑树实现上更加简单<br>
以空间换时间的方式提升了查找速度
持久化
RDB
AOF
选型
AOF可最大化减少数据丢失
RDB恢复速度快
可两者结合
数据淘汰
策略
noeviction
不淘汰,写入报错
allkeys-lru
针对所有key的最近最少使用策略
volatile-lru
针对设置过期时间的最近最少使用策略
allkeys-random
针对所有key的随机策略
volatile-random
针对设置了过期时间key的随机策略
volatile-ttl
针对设置了过期时间的key的ttl策略
机制
定时删除
定时删除过期key的引用
惰性删除
访问存在的key的第一步先检查ttl,如果过期先删除
缓存穿透
持续查库
接口层校验
回种空值
布隆过滤器
缓存击穿
热点数据突然失效
不设置过期时间
查库加互斥锁
内存缓存
缓存雪崩
大量热点数据同时失效
过期时间设置随机
服务器宕机
集群,保证高可用
分布式锁
boolean result = set(key,value,NX,EX,expireTime)
一个语句加锁,代码级别保证原子性
加锁时需要同时设置过期时间和返回值,只执行一行代码来保证原子性
解锁时需要判断value是不是一致的,避免被另一个线程误解锁
集群下:Redission的RedLock
集群部署
主从复制(主写从读,非高可用)
1.主服务器创建快照文件发送给从服务器,并且缓冲区记录写命令
2. 从服务器载入快照文件,接收主服务器发过来的从缓冲区记录的写命令并执行
3.主服务器每执行一次写命令,就向从服务器发送相同的写命令
sentinel哨兵机制
哨兵监测主节点,故障转移(高可用)
从节点不提供服务
cluster无中心架构
数据分片,单机存储部分数据
解决容量限制的问题
MQ
选型
吞吐量
可靠性
RabbitMQ
Erlang语言实现
金融场景使用,较高严谨性
支持多协议(AMQP、MQTT、STOMP)
支持延迟队列、优先级队列、死信队列
消费模式:推模式+拉模式
单机QPS在万级别之内
Kafka
日志领域,高吞吐量
多分区、多副本、可水平扩展、高吞吐量
基于zookeeper协议
支持消息回溯
消费模式:拉模式
单机QPS在十万~百万级别
分布式
CAP定理
BASE理论
微服务
注册发现
Eureka(AP)
Zookeeper(CP)
Nacos(AP、CP)
服务治理
负载均衡
LoadBalanced
Ribbon
配置中心
Nacos
熔断
限流&降级
Hystix
Sentinel
高并发
分布式事务
XA规范(X/Open组织提出的DTP模型)
AP(应用程序)
WEB应用
RM(资源管理器)
数据库
TM(全局事务管理器,上帝视角)
交易中间件
CRM(通信资源管理器)
消息中间件
2pc两阶段提交
1prepare2prepare,1commit2commit
RM同步阻塞问题
TX发生单点故障,RM阻塞
部分commit,数据不一致
3pc三阶段提交(2pc升级版)
解决TX单点故障,引入超时机制,减少阻塞
把2PC的准备阶段一分为二,变成CanCommit、PreCommit、DoCommit
TCC应用层事务补偿
Paxos分布式选举算法
Zab
Raft
IO
IO多路复用
通过单个线程去记录每个sock的状态来同时管理多个IO流
select,poll,epoll的发展
poll单线程、epoll多线程
并发不高,连接活跃度比较高:Select更合适(eg:小游戏)
高并发下,连接活跃度不高时:epoll比Select性能高(eg:web请求,页面随时关闭)
Select是win和linux通用的,而epoll只有linux有<br>
ES
k8s
docker
排查问题
df、free、top三连
频繁gc:jstat -gc pid 1000
频繁上下文切换:vmstat pid
死锁
算法模型
归并排序
滑动窗口
raft
其他
缓存与数据库不一致怎么办
0 条评论
下一页