思维导图
graph LR
Java--> A(Java基础)
A-->基础类型
A-->线程池
A-->Concurrent包
A-->NIO
A-->分布式
A-->代码规范
Java--> Spring
Spring-->IOC容器
Spring-->资源
Spring-->验证,数据绑定
Spring-->AOP
Java--> SpringCloud
Java--> JVM
JVM-->内存模型
JVM-->回收器
回收器-->G1,CMS
JVM-->回收算法
回收算法-->复制算法
回收算法-->标记回收
回收算法-->标记整合
回收算法-->分代回收
Java-->C(中间件)
Java-->D(数据库)
Java-->算法
C-->缓存-->Redis
Redis-->8种基础数据结构
Redis-->持久化rdb,aof
C-->消息队列
C-->定时器
定时器-->Xxl-Job
定时器-->Saturn
消息队列-->RockerMQ
RockerMQ-->事务消息
RockerMQ-->持久化
RockerMQ-->确保消息准确性
消息队列-->Kafka
Kafka-->基础结构-->生产者,消费者,broker,partition
Kafka-->零拷贝
SpringCloud-->服务注册中心
服务注册中心-->Eureka-->AP
服务注册中心-->Nacos-->AP
服务注册中心-->Zookeeper-->CP
SpringCloud-->网关
网关-->Zuul
网关-->Gateway
SpringCloud-->日志追踪-->Sleuth,Zipkin
SpringCloud-->熔断器-->Hystrix
SpringCloud-->远程调用
远程调用-->Fegin-->Ribbon
远程调用-->Dubbo
D-->Mysql
D-->Mongodb
Mysql-->索引
索引-->聚集索引
索引-->非聚集索引
索引-->最左原则
Mysql-->引擎
引擎-->Innodb
Innodb-->索引数据结构-->B+
引擎-->MyIsam
Mysql-->事务-->隔离级别
隔离级别-->RR,RC,串行读,读未提交
隔离级别-->MVCC
Java基础
-
Java基础类型:char,byte,boolean,long,double,float,int
-
sleep,wait区别:sleep是Thread方法,wait是对象的方法。锁的话,wait会释放锁,一般锁指对象锁。
-
死锁4要素:持续占用,不可剥夺,互斥,循环等待
-
线程安全3要素:可见性,原子性,有序性
-
volitial可见性,但是保证不了原子性。原子性就是大家一起成功,一起失败。
-
动态代理:cglib,jdk代理 cglib是字节码生成子类,jdk代理是通过实现方法来创建子类
-
Http状态码: 301永久转移 302 临时转移
-
springboot热部署:devtools
-
java双亲委派:Boostrap Classloader 加载,Application Classloader加载,保证类的唯一性
-
类加载过程: 加载->检测-> 准备->解析->初始化
-
Nio,Aio,Bio Nio同步非阻塞,Aio异步非阻塞,Bio同步阻塞 IO 流 Nio Buffer Nio selector来管理channel ,当channel准备了,就可以进行接通 Direct Buffer直接缓冲区,channel.transferTo 零拷贝
-
线程池 1)核心参数:初始化线程数,最大线程数,拒绝策略,队列 2)工作原理:当线程数小于核心数量,会继续创建 当线程数大于核心数量,小于最大线程数,会把他们放到队列里面 当线程数大于最大线程数,之后会执行拒绝策略 合理的设计:核心线程数+队列数量>最大线程数 3)线程池的创建:Executors还有ThreadPoolExecutor创建。由于上面的原理可以知道,最好是手动创建,因为Executors使用一些无界队列。
报错 1)execute会输出日志,submit不会输出日志 2)submit返回Future,可以使用try,catch来捕获异常 3)Thread实现setUncatchExceptionHandler
-
BeanFactory跟FactoryBean区别 类工厂,工厂类。BeanFactory会创建FactoryBean ApplicationContext跟FactoryBean区别 ApplicationContext是FactoryBean子类,新增国际化,资源等等
-
事务管理器同步
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization(){
void afterCommit(){
//do what you want to do after commit
}})
- spring循环依赖
- @Qualifier
- @Lazy
- 本地事务、分布式事务
本地事务 ACID 原子性,一致性,隔离型,持久性
分布式事务 CAP 一致性,可用性,分区容错性
XA两段式提交
AP
TM事务管理器
TC统一的事务管理器
RM资源管理器
BASE理论:最终一致性
17. AOP aop顺序:around->before->after @Order值越高,越先进,越后出
- spring事务传递性(主要的) required 默认级别 有事务就用当前事务,没有的话就新建 required_new 新建事务 如果当前有事务就挂起,再新建一事务 Nested 嵌套事务 里面回滚外面也回滚 Not_supported 挂起事务
Spring
-
Ioc容器 Java通常讲:控制反转,依赖注入 按照一般情况是去new一个对象,但是spring的话是交给了容器
-
@Resource按照name去加载 @Autowired是按照type来加载
-
国际化i18n MessageSource
-
资源 Resource
-
验证,数据绑定和类型转换 Validator
-
BeanWrapper操作类属性
-
具有AspectJ切入点的Spring AOP
-
记录 LogFactory MDC
JVM
- 内存模型 程序计数器,堆,栈,方法区,本地方法栈 static放在方法区里面
- 回收算法:复制算法,标记清理算法,标记整理算法,分代回收 新生代 复制算法,快,碎片多 老年代 标记清理算法 永久代
- 回收器类型 G1 会将空间划分,然后进行回收 CMS 目的是为了缩短回收的时间,标记清理算法 CMS与G1对比
- Eden,Survior比例是1:2 由于新生代采用复制算法,可以快速的回收
- OOM处理 Mat分析泄露日志 jvm命令 jstat 查看gc日志 jmap 导出gc日志
- jvm参数 -Xmx 堆最大值 -Xms 堆初始值 -Xx:survivorRatio = 8 也就是Eden:Survivor 8:2
中间件
redis
- 8种类型:string,list,hash,set,zset,geo,hyloglog,bitmap
- redis持久化rdb,aof rdb全量定期刷 aof增量刷
- redis批量获取 mget Pipeline
- redis分布式锁 setnx ->px delete判断是否是当前的获取到锁 存在问题:nx,px的时候,不安全,lua
- redission 看门狗,在业务没有结束的时候会自动续期
- redlock解决集群分布式锁同步的问题
- redis单线程 多线程存在线程上下文切换的问题,IO多路复用
消息队列
RocketMQ
- 事务消息
事务开启时会有half消息,根据本地事务来判断这个half消息是commit还是rollback,至于MQ接收方的处理采用最终一致性来实现,如果消费不了,会重试。最后不行会放到死信,或者人工处理。
- 顺序消费,只需放在同个MQ集群
- 重复消费,需要业务方自行处理,mysql唯一键
- 持久化,commitLog 同步刷盘,异步刷盘
- 重发机制messageDelayLevel = 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
- 准确性:最多一次,刚好一次,最少一次 生产者 最多一次,保证消费者可以消费 消费者 刚好一次消息,业务控制
Kafka
-
概念 topic: 生产者跟消费者根据topic进行消费,对数据分类 consumer group: 逻辑概念,客户端组,一个topic会广播给不同组,一个组只能一个客户端收到信息 broker: 物理概念,kafka节点,一个客户端一个broker partition: 物理概念, kafka数据存储基本单元,一个topic会分布在不同的patition里面,patition里面是有序 Replication: 相当副本作用,增加容错性,可扩展性
-
零拷贝 磁盘->内核->用户空间->socket
The operating system reads data from the disk into pagecache in kernel space 操作系统将数据从磁盘读入到内核空间的页缓存 1)The application reads the data from kernel space into a user-space buffer 应用程序将数据从内核空间读入到用户空间缓存中 2)The application writes the data back into kernel space into a socket buffer 应用程序将数据写回到内核空间到socket缓存中 3)The operating system copies the data from the socket buffer to the NIC buffer where it is sent over the network 操作系统将数据从socket缓冲区复制到网卡缓冲区,以便将数据经网络发出
-
持久化 储存在文件系统
-
kafka消息保证 So effectively Kafka guarantees at-least-once delivery by default and allows the user to implement at most once delivery by disabling retries on the producer and committing its offset prior to processing a batch of messages. Exactly-once delivery requires co-operation with the destination storage system but Kafka provides the offset which makes implementing this straight-forward.
kafka默认是保证“至少一次”传递,并允许用户通过禁止生产者重试和处理一批消息前提交它的偏移量来实现 “最多一次”传递。而“正好一次”传递需要与目标存储系统合作,但kafka提供了偏移量,所以实现这个很简单。
To achieve this, the broker assigns each producer an ID and deduplicates messages using a sequence number that is sent by the producer along with every message。
为了实现这一点,broker向每个生产者分配一个ID,并通过生产者发送的序列号和每个消息,达到消除重复消息的目的。
-
分区越多消费越快,consumer可以去多个分区拿数据
-
kafka快原因:批量处理,分区,零拷贝,消息压缩,顺序写盘
Spring cloud
服务注册中心
- Eureka AP
- Zookeeper CP
- Nacos AP
ZK
- 临时,永久,顺序
- zk实现分布式锁,临时顺序节点,通过监听节点的变更
Hystrix
- 有两种熔断方式:线程池模式,信号量
- 那么他们的区别? 线程池是可以使用线程池拒绝策略进行限制的,资源消耗比较大,可以支持超时处理,信号量的话比较单一
数据库
Mysql
-
索引 B+树 最左原则 聚集索引,主键 非聚集索引,普通索引 二分法最快查询到数据
-
引擎 Innodb MyIsam
-
事务 ACID 原子性 一致性 隔离性 持久性
-
隔离级别RR RC主要 RR MVCC
-
索引下推 aa like '林%' and xx = 20
这时会忽略xx,先把aa 符合的数据先查出来,然后再进行筛选。 索引下推之后: 这时没有忽略xx,在判断aa的时候会连同xx的条件判断进去。
-
左模糊会用到索引
-
悲观锁 for update 乐观锁 version
-
死锁的处理方式:show innodb status查看死锁的日志
-
explain查看sql执行计划