图灵课程-流程图
2022-12-09 17:10:01 24 举报
spring相关流程图
作者其他创作
大纲/内容
触发FULL GC
slave1收到master2 和master3两个ack回复就可以成为新的主节点
否
tail
程序计数器 a=2
Data1
新建new thread
next
是否实现InitializingBean接口
加锁失败
while循环,间接性的尝试加锁(自旋)
slave1
后台线程
Semaphore信号量
1、slave发现自己的master变为FAIL2、将自己记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST 信息3、其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch只发送一次ack4、尝试failover的slave收集master返回的FAILOVER_AUTH_ACK5、slave收到超过半数master的ack后变成新Master(这里解释了集群为什么至少需要三个主节点,如果只有两个,当其中一个挂了,只剩一个主节点是不能选举成功的)6、slave广播Pong消息通知其他集群节点。
state = 0
thread= thread-1nextWaiter=nullwaitStatus = 0
完成入队操作
是否大于0
阻塞线程
初始化
3调用处理器适配器处理Handle
返回View
是否存在@PostConstruct的方法
发送一条解锁通知
7返回响应
Redis3种情况
head
thread-2
thread= nullnextWaiter=nullwaitStatus = -1
获得时间片
解决方案
1个
小于0
大于0
运行状态
thread= thread-1nextWaiter=nullwaitStatus = -1
s11/10
大于等于0
通过启动类得到扫描路径
任务存储在队列
ContextRefreshedEvent事件
state = 1
Redis分布式锁原理
锁不仅不存在多线程竞争而且总是由同一线程多次获得
类加载检查
向上委托
是否加载类
master2
int b =10
线程1
Survivor区
cas尝试加锁
Bean的创建
响应
AQS加锁 3个线程1、thread1线程CAS尝试加锁,将state改为1,加锁成功,维护一个exclusiveOwnerThread = thread1,锁重入变量2、thread2线程常CAS尝试加锁,加锁失败 2.1 完成入队, 2.2 阻塞当前线程
解析配置类得到span style=\
Redis(Slave)
唤醒队列阻塞的线程
Redisson
JVM整体结构及内存模型
依赖注入
Using filesort文件排序
prev
动态链接
LockSupport.park(s.thread)
线程生命周期
类加载器
按照设置的策略执行
5调用视图解析器
发起http请求
创建核心线程执行
ApplicationContext
局部变量表
beanDefinitionMap
成功加锁
提交任务
支持国际化
thread= thread-2nextWaiter=nullwaitStatus = 0
所以线程订阅一个消息通知
支持事件机制
线程2
堆
DB数据库
查看锁是否过期,锁续命,默认是10秒执行一次
注册到
Bean定义包含的属性1、scope 单例还是原型2、@Lazy 是否懒加载3、Class Bean的类型
应用程序类加载器AppliCation ClassLoader
程序计数器
加载jdk/lib目录下的JAR
是
thread=nullnextWaiter=nullwaitStatus = -1
ViewReslover视图解析器
thread=thread-2nextWaiter=nullwaitStatus = 0
判断对象是否需要AOP
V操作
加锁成功
内存分配方法1、指针碰撞(默认)2、空闲列表
int a = 10
thread=nullnextWaiter=nullwaitStatus = 0
master3
非懒加载的单例Bean
操作数栈
thread-1
2请求处理映射器
spring Bean创建
失败
创建线程执行
JSP页面
DispatcherServlet前端控制器
加载类
JVM对象创建
唤醒线程1
S+1
本地方法栈
推断构造方法
需要B
锁机制
构造一个BeanFactory对象
slave2
核心线程池是否已满
BeanFactory的单例池
发布
thread=thread-1nextWaiter=nullwaitStatus = 0
线程尝试使用 CAS将对象头中的Mark Word替换为指向锁记录的指针。如果成功,当前线程获得锁,如果失败,
test()方法栈帧
1、存在一个构造方法,不管是有参还是无参,都使用该构造方法2、存在多个构造方法 2.1 存在无参构造方法,使用无参构造方法 2.2 存在多个构造方法,看是否存在@Autowired注解,如果存在就使用注解的构造方法 2.3 多个就会报错,不知道使用那个方法3、Bean的类型 单例:会立即创建然后存入一个名叫singletonObjects的map对象中,也叫单例池 原型(多例):不会创建,会在每次使用的时候创建
解锁
JVM运行时数据区
双路排序(回表)
对象
需要A
扫描路径下的类,生成Bean定义,BeanDefinitionMap
遍历扫描路径下的所有类,如果类上面包含@service、@controller 、@component等注解,就将当前类生成BeanDefinitionMap存下来
GC分代年龄
Semaphore 信号量
6视图渲染
打破双亲委派模型,重写loadClass方法
主节点挂了
方法区常量、静态变量、类元信息
就绪状态(可运行)
从节点并不是在主节点一进入 FAIL 状态就马上尝试发起选举,而是有一定延迟延迟计算公式: DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms
实例数据
spring启动
执行init()
入队之后
User对象
CAS加锁
Eden(8/10)
引导类加载器Bootstrap ClassLoader
解析配置类得到扫描路径
解决方法1、设置空对象,并设置过期时间2、使用布隆过滤器
Aware回调
只能升级,不能降级
对象头
调用start()
是否实现接口
2-生成的
调用
轻量级锁
存放在
BeanFactory
Redis集群选举流程
thread-0
偏向线程ID
队列是否已满
自定义类加载器继承 ClassLoader
1) 保证缓存层服务高可用性,比如使用Redis Sentinel或Redis Cluster。2) 依赖隔离组件为后端限流熔断并降级。比如使用Sentinel或Hystrix限流降级组件。3) 提前演练。 在项目上线前
返回具体的Handler
mian线程
缓存和数据库都不存数据
数据库
释放锁 unlock
添加到
线程共享
创建
缓存穿透
web服务器
Redis(Master)
1发起请求
FILO 先进后出
则该进程被阻塞和放入等待该信号量的队列中,然后转进程调度
Minor GC/Young GC:指发生新生代的的垃圾收集动作,Minor GC非常频繁,回收速度一般也比较快Major GC/Full GC:一般会回收老年代 ,年轻代,方法区的垃圾,Major GC的速度一般会Minor GC的慢10倍以上
生成对象
BeanNameAware接口、BeanClassLoaderAware接口、BeanFactoryAware接口
Lifecycle Bean的start()方法
创建B
加载自定义路径的类文件
加载classPath下的类包
多个
返回ModelAndView
new User()
头结点waitStatus = 0
父类加载器加载失败,会由子类加载器自己加载
客户端
线程池处理流程
代码设计一些计数的操作
HandlerMapping处理映射器
取出排序字段,或者定位的ID
构造方法个数
第一点会先进行下面的算法
lock
是否大于max_length_for_sort_data
字节码执行引擎
老年代2/3
初始值为0
偏向时间戳
4 调用具体处理器
exclusiveOwnerThread = thread-0
启动类class
LockSupport.park(this) 阻塞线程
klass类型指针
设置对象头
单路排序
加载jdk/lib/ext目录下的JAR包
对象存储布局
线程池是否已满
缓存没有 数据库有
可以通过加分布式锁解决
缓存击穿
偏向锁
exclusiveOwnerThread = thread1
表的字段长度之合
红色的头结点出队,当前线程结点thread设置为null
数据量太大还涉及使用临时文件排序
1-扫描
双亲委派模型
无锁
Testservlet
P操作
修改计数器的值
存在一个构造方法,不管是有参还是无参,都使用该构造方法
缓存雪崩
线程持有的锁
解析@ComponentScan,此时就会完成扫描解析@Import解析@Bean
栈(线程)
exclusiveOwnerThread = null
年轻代
初始化后
重量级锁
当前线程获得锁
当Eden存放不了数据触发minor gc
CAS尝试加锁
分配内存
这个是存放在一起的
main方法栈帧
ApplicationEventMulticaster对象
会判断当前对象是否存在@Autowired或者@value等注解,如果存在就进行赋值
唤醒前准备
扩展类加载器Extension ClassLoader
trace工具可以通过sort_mode查看排序类型< sort_key,additional_fields,packed_additional_fields>
出队
A创建
master1
s01/10
方法出口
对齐填充
大量的请求到数据库
View视图
分配内存并发问题1、CAS2、本地线程分配缓冲
cas加锁解锁流程
存储对象自身的运行时数据 Mark word
成功
线程独享
业务处理
MessageSource对象
取出所有满足条件的字段
数组长度 (只有数组对象有)
1、存在无参构造方法,使用无参构造方法2、存在多个构造方法,看是否存在@Autowired注解,如果存在就使用注解的构造方法3、多个就会报错,不知道使用那个方法
servlet容器
初始化前
HandlerAdaper处理器适配器
表示其他线程竞争锁,当前线程便尝试使用自旋来获取锁
小于等于0
把ApplicationListener对象
sort buffer排序
则从该信号的等待队列中释放一个等待进程,然后再返回原进程继续执行或转进程调度
普通对象
S-1
哈希码(HashCode
Handler处理器,后端控制器
锁状态标志
this
0 条评论
下一页