Java知识体系
2020-05-29 14:48:51 0 举报
AI智能生成
Java面试指南
作者其他创作
大纲/内容
JDK相关
集合相关
Map
HashMap
JDK1.7
数组+链表
int DEFAULT_INITIAL_CAPACITY = 1 << 4;
newCap = oldCap << 1
JDK1.8
数组+链表+红黑树
空间+效率,避免自己实现的hashCode影响效率,泊松分布
TreeMap
顺序
比较器 Comparator
HashTable
Collection
List
ArrayList
数组
DEFAULT_CAPACITY = 10
Arrays.copyOf
int newCapacity = oldCapacity + (oldCapacity >> 1);
remove问题
LinkedList
列表
Vector
Set
HashSet
用的HashMap实现
LinkedHashSet
modeCount
JDK 线程安全集合
喂(Vector)
S(Stack)
H(HashTable)
E(Enumeration)
JUC
Map
ConcurrentHashMap
JDK1.7
16个Segment
static class Segment<K,V> extends ReentrantLock
JDK1.8
数组”+链表+红黑树
CAS算法
ConcurrentSkipListMap
类似于TreeMap
COW
CopyOnWriteArrayList
CopyOnWriteArraySet
Queue
ConcurrentLinkedQueue
BlockingQueue
有界队列 ArrayBlockingQueue
无界队列 LinkedBlockingQueue
优先级队列 PriorityBlockingQueue
延迟队列 DelayQueue
SynchronousQueue
重载/重写
重载:两同三不同
重写:两小一大两相同
拦截器/过滤器
Sleep 和 wait区别
开源框架
Spring
生命周期
初始化
属性注入
Aware接口
BeanPostProcessor的before方法
初始化方法initializingBean
BeanPostProcessor的agter方法
Bean可用状态,执行业务处理
DisposableBean的destroy()
作用域
prototype
singleton
web
request
session
globalsession
循环依赖
singleFactory
earlySingleObject
singleObject
事务
编程式
声明式
传播特性
设计模式
工厂
单例
代理
模板方法
观察者模式
基础概念
IOC:原先代码需要实现的对象创建/依赖的代码交由容器实现,需要描述对象之间的关系
DI: 被动接受依赖而不是主动去找,基于IOC
AOP
BeanFactory 和ApplicationContext 的区别
BeanFactory 采取延迟加载,第一次getBean时才会初始化Bean
ApplicationContext 即时加载
SpringMVC
流程
发起请求到前端控制器(DispatcherServlet)
前端控制器请求HandlerMapping查找 Handler
处理器映射器HandlerMapping向前端控制器返回Handler,
HandlerMapping会把请求映射为HandlerExecutionChain对象
(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器对象)
HandlerMapping会把请求映射为HandlerExecutionChain对象
(包含一个Handler处理器(页面控制器)对象,多个HandlerInterceptor拦截器对象)
前端控制器调用处理器适配器去执行Handler
处理器适配器HandlerAdapter将会根据适配的结果去执行Handler
Handler执行完成给适配器返回ModelAndView
处理器适配器向前端控制器返回ModelAndView (ModelAndView是springmvc框架的一个底层对象,包括 Model和view)
前端控制器请求视图解析器去进行视图解析
(根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可
(根据逻辑视图名解析成真正的视图(jsp)),通过这种策略很容易更换其他视图技术,只需要更改视图解析器即可
视图解析器向前端控制器返回View
前端控制器进行视图渲染 (视图渲染将模型数据(在ModelAndView对象中)填充到request域)
前端控制器向用户响应结果
Dubbo
工作原理
10层架构
RPC流程
provider向注册中心注册
Consumer从注册中心订阅服务
会通知Consumer注册好的服务
会通知Consumer注册好的服务
调用
异步通知监控中心
支持哪些序列化
dubbo协议->单一场链接 NIO异步 hessian协议
rmi -> java序列化
hessian
http -> json序列化
webService -> 文本序列化
负载策略
随机
一致性Hash
集群容错
服务降级 mock属性
如何设计一个RPC框架
注册中心
代理,代理会找到对应IP等信息
负载均衡
序列化等
SpringBoot
SpringCloud
Eureka
Feign
Config
Zuul
Hystrix
分布式
分布式事务
两阶段提交
TCC
本地消息列表
最终一致性方案
最大努力通知型
分布式锁
为什么拆分
Base 理论
基本可用性:出现不可预知故障的时候,允许损失部分可用性
软状态:允许系统中的数据存在中间状态
最终一致性
CAP理论
Consistency (一致性)
Availability (可用性)
Partition Tolerance (分区容错性)
常用组件
Zookeeper
使用场景
分布式协调
分布式锁
配置管理
HA高可用
分布式锁
获取锁->创建临时节点
尝试获取锁 -> zk.exists()exists 注册某个节点的事件处理器
释放锁-> 删除临时节点 -> 通知节点变更
被通知 重新获取锁 -> 创建临时节点
如果挂掉会自动删除临时节点
Nginx
负载均衡算法
upstream中配置
轮询
加权轮询
随机
最少连接
源地址散列
MQ
选型分析
作用
异步处理
高并发削峰
系统结构
副作用
系统复杂性提高
存在数据一致性问题
消息消费幂等
RabbitMQ confirm模式,手动ack
关闭autoAsk
本身做持久化
系统可用性降低(RabbitMQ)
单机
普通集群
镜像集群
消息顺序
多个Queue 保证顺序操作进入同一个Queue
如何设计一个消息中间件
扩容、分布式
持久化
高可用
数据丢失
网络
网络模型
OSI模型
应用层
表示层
会话层
传输层
网络层
数据链路层
物理层
TCP/IP模型
应用层:解决要传递什么数据
传输层:解决如何传输数据
网络层:解决如何传输数据
链路层:具体传输工具
一次请求的流程
先要解析出目标网站对应的IP地址
需要知道默认网关的MAC,使用ARP协议获取默认网关的MAC地址
组织数据发送给默认网关(ip是dns服务器ip,MAC地址是默认网关的地址)
默认网关拥有转发数据的能力,将数据转发给路由
路由根据自己的路由协议来选择一台合适的较快的路径,转发数据到目的网关
目的网关(DNS服务器所在网关)把数据转发给dns服务器
Dns服务器查询解析目标网站对应IP原路返回给客户端
得到IP后发送3次握手并进行TCP链接
使用HTTP协议发送请求数据给web服务器
Web服务器收到请求,通过查询自己的服务器得到相应的结果,原路返回给客户端
浏览器接收数据并完成渲染显示
浏览器关闭TCP链接,四次挥手
JVM
内存模型
方法区
类信息
常量
静态变量
JIT编译后的信息等
Java堆
新生代
Eden
Survivor
From
To
老年代
虚拟机栈
本地方法栈
程序计数器
GC(垃圾回收)
确定对象是否存活
可达性分析发
引用计数法
JAVA引用类型
强引用(new)
软引用(SoftReference)
弱引用(WeakReference)
虚引用 (PhantomReference)
垃圾收集算法
标记 - 清除算法
复制算法
标记 - 整理算法
分代收集算法
垃圾收集器
Serial 收集器
ParNew收集器
Prarallel Scavenge 收集器
Serial Old
Parallel Old
CMS
G1 (Garbage-First)
GC时机
MinorGC
FullGC
内存分配
类加载
时机
new getstatic putstatic invokestatic
反射调用
初始化时对父类进行加载
主类(main)
过程
加载
通过全限定名获取定义此类的二进制字节流
静态存储结构 -> 运行时数据结构
Class对象,方法区类数据访问入口
连接
验证(是否符合JVM规范)
准备(分配内存并设置类变量初始值)
解析(常量池内的符号引用替换为直接引用)
初始化
<clinit>() 方法 类变量复制及静态代码块
使用
卸载
类加载器
由同一个类加载器加载 相等 才有意义
双亲委派模型
启动类加载器(<JAVA_HOME>\lib)
扩展类加载器(<JAVA_HOME>\lib\ext)
应用程序类加载器
JMM(内存模型)
多线程
锁
Synchronized
锁细化
锁粗化
锁升级
无锁
偏向锁
轻量级
重量级
ReentrantLock
死锁必要条件
互斥条件:一个资源每次只能被一个进程使用
占有且等待:一个进程因请求资源而阻塞,对已获得资源保持不放
不可强行占有: 进程已获得资源,在未完成使用之前,不可强行剥夺
循环等待: 若干线程之间形成头尾相接的循环等待关系
乐观/悲观
synchronized和ReentrantLock等独占锁就是悲观锁思想
CAS 实现的乐观锁 ABA问题
内存模型
线程(有个本地内存)
本地内存(共享变量的副本)
主内存(共享变量)
happens-before规则
程序顺序规则:每个操作 happens-before任意后续操作
监视器锁规则:解锁,happens-before于随后加锁
volatile变量规则:volatile域的写,hb与任意后续volatile读
传递性
Volatile的内存语义
可见性
原子性
禁止指令重排序(double check问题)
线程
概念:线代操作系统调度的最小单元,轻量级进程
为什么要使用多线程
更多的处理器核心
更快的响应时间
更好的编程模型
AQS(队列同步器)
结构
同步队列-FIFO双向队列
private volatile int state;
相关实现
CountDownLatch
ThreadPoolExecutor
ReentrantLock
Semaphore
线程池
NewFixedThreadPool()
NewSingleThreadExecutor()
NewCachedThreadPool()
NewScheduledThreadPool()
如何设置线程数
CPU密集型
N*2 或 N+1
I/O密集型
N/(1-a)a=阻塞系数<1
数据存储
MySQL
存储引擎
InnoDB
IBD
所有数据都存放在叶节点
辅助索引叶节点保存主键的关键字
再次根据主键进行二次遍历
再次根据主键进行二次遍历
FRM
MyISAM
MYI: Index
MYD: Data
FRM:表定义文件
优化方向
索引优化
EXPLAIN
SHOW WARNINGS;
索引原则
经常要排序、分组、联合操作的字段
经常做查询条件的字段
限制索引的数目
尽量使用数据量小的索引
最左前缀 > < between like
不能参与计算的列
尽量扩展不要新增
NOT IN <> 无法使用索引
索引创建
最左匹配
列离散型 ,越低导致查询优化器无法优化
最少少空间原则
覆盖索引
通过索引项的信息可直接返回
不用去表加载
不用去表加载
B-Tree:多路平衡查找树
页:内存最小存储单位 4K
多路:二叉树多个叉
路数 = 关键字+1
索引字段越小,路数越多,IO次数越少 效率越高
B+Tree
关键字采用闭合区间
非叶子节点不保存信息,只保存关键字和子节点的引用
叶节点保存关键字
效率更稳定
SQL优化
缓存优化
读写分离
集群方案
PXC
修改底层协议
同步复制
多主复制,多节点可读可写
主从
主从复制
主从延迟
分库
并行复制
代码层面
分库分表
为什么拆分
中间件
proxy
mycat 基于cobar
client
sharding-jdbc 当当
TDDL
拆分方式
垂直拆分(切字段)
水平拆分(切记录)
range存在热点问题
字段hash(压力均衡)
拆分方案
倒数作业,停机迁移
双写迁移
动态扩容方案
事务
ACID
原子性(Atomicity): 通过UndoLog实现
一致性(Consistency)
隔离性(Isolation):通过锁机制实现
锁
共享锁
lock in share model
排它锁
for update
持久性(Durability):通过RedoLog实现
事务并发问题
脏读:读到未提交事务
不可重复读:两次读取到的数据不一致 update
虚读:两次读取到的数据不一致 insert
丢失更新:后提交的事务覆盖先提交的数据
事务隔离界别
Serializable:串行 都可以避免
Repeatable:可重复读,避免 脏读,不可重复读
Read Committed:读已提交 避免脏读
Read uncommitted:读未提交 无法保证
超大记录分页
范式
1NF:每一列都是不可分割的基本数据项,同一列无二值;无重复的域;
2NF:实例依赖于主键部分;
3NF:属性不依赖于其他非主属性;
Drop,Delete和Truncate
INSERT INTO SELECT
查看数据库连接:Show Full Processlist
流程
连接器
分析器
词法
语法
优化器
执行器
Redis
高可用
主从
主从复制
主从同步
哨兵
原理
选举主
Cluster:分布式解决方案
集群节点被分为16384个槽
clusterNode每个节点记录槽是否对应自己 1是 0否
节点计算哪个槽>如果自己则执行>不是自己返回MOVED错误及节点信息指引客户端
高性能
单线程模型
I/O多路复用
基于内存
数据结构
String
一般性Key Value
Hash
对象存储,可以针对某个属性修改
List
轻量级别的队列,栈等结构,好友队列,粉丝队列,消息队列,最新消息排行
Set
数据去重,交集并集差集,共同好友、共同兴趣、分类标签
SortSet
有序去重,排行榜
Bitmap
BloomFilter
GeoHash
位置坐标
HyperLogLog
提供不精确的去重计数方案
Streams
支持多播的可持久化的消息队列
持久化
AOF
增量,没次操作指令都存储,文件大
RDB
快照,固定周期生成快照,全量数据,存在数据丢失问题
AOF+RDB
Redis4.0后支持混合配置
过期策略
定期删除+惰性删除
缓存淘汰
分布式锁
常见问题
同时写入大量KEY
查询某一前缀的key
异常情况
缓存雪崩
事前
redis高可用,主从+哨兵,Redis Cluster
事中
本地Cache+hystrix限流、降级
事后
Redis持久化,快速回复
缓存穿透
空值也写入Redis
布隆过滤器
并发竞争
分布式锁,判断时间
缓存击穿
双写一致
Cache aside patten
异步串行,相同ID 取模到同一内存队列
线上问题排查
Btrace
动态拦截方法,调试线上代码
Jstat
JVM统计信息
Jmap+MAT
分析OOM
Jstack
查看线程,排查处理死锁
0 条评论
下一页