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