bean的生命周期:
1.将bean定义beandefinition到中,IOC会根据这个beandefinition来实例化这个类
2.实例化bean(会涉及到bean的循环依赖和AOP)
从三级缓存中获取bean的实例(解决bean的循环依赖问题)
先从一级缓存singletonObject中获取,该缓存存放的是已经实例化好的bean,
如果一级缓存为空,并且对象是正在创建的,那么这时候会去找二级缓存,earlysingletonObject,
如果二级缓存为空,并且对象是允许早起引用的,那么回去三级缓存singletonFactory中获取。获取到了将三级缓存提升到二级缓存中,并且移除三级缓存中的数据。
容器在实例化的时候会用动态代理来实例化bean,如果被代理的类实现了接口,则采用JDK的动态代理,其他的则是采用cglib
3.根据反射填充bean的属性
4.如果bean实现了beannameaware接口 ,则会调用bean的setbeanname方法传入bean的ID。
5.如果bean实现了beanfactory方法,则会调用setbeanfactory将beanfactory传入对象本身。
6.如果bean实现了beanprocessor接口,则会调用postprocessorbeforeinitialization方法
7.如果bean实现了initializingBean接口,则会调用bean的init-method初始化方法
8.如果bean实现了beanprocessor接口,则会调用postprocessorafterinitialization方法
类加载机制
加载:将字节码文件通过类加载器加载到内存中
验证:验证字节流数据是否符合虚拟机的规范
准备:为类的变量分配内存并赋予初值(基本引用类型,则初值为0,引用数据类型,则初值为null)
解析:将常量池内的符号引用替换为直接引用,这个过程,虚拟机换将类名,方法名字段名等这些符号引用替换为具体的内存地址。
初始化:对static修饰的变量进行初始化,使用到了双亲委派模式。避免类的重复初始化
使用:
卸载:
JVM内存模型:
堆:存放对象
虚拟机栈:存放局部变量,对象的引用
本地方法栈:执行native方法
方法区:存放类的信息,常量,静态变量
程序计数器:记录虚拟机字节码指令
堆的回收区域:
新生代
老年代
元空间
垃圾回收算法:
复制算法:将空间划分为相等的两份,每次只使用其中的一份,当其中一份用完的时候,会把存活的对象移动到另一边,然后把剩下的部分清理掉(用于新生代)
标记清除:将需要回收的对象进行标记,标记完成后将所有的对象进行回收,缺点:会产生大量的内存碎片
标记整理:将需要回收的对象进行标记,然后将存活的对象移动到另一端,再清理剩下的部分
垃圾收集器:
新生代:serial
老年代:serial old
线程池参数:
核心线程数
最大线程数
闲置线程允许存活的时间
线程存活的时间单位
阻塞队列:arraylockingQueue,linkedlockingqueue,synchronouslockingqueue
线程工厂
拒绝策略:1.丢弃线程并抛出错误,2.丢弃线程,不抛出错误,3.丢弃队列中最前面的线程,并尝试执行当前任务,4.由调用线程处理该任务
方法区: 类的信息,常量,静态变量
堆: 对象
虚拟机栈:局部变量,动态链接,方法出口
本地方法栈: 本地Native方法
程序计数器: 字节码指令地址
堆: 新生代 老年的 元空间
新生代: Eden : FromSurvior : ToSurvior = 8 : 1 : 1
新生代: MinorGC (使用复制算法)
老年代: MajorGC (使用标记-整理算法)
spring boot 自动配置的原理:
在启动类中使用了@SpringBootApplication注解
@EnableAutoConfiguration注解是自动配置的核心,注解内部使用了@Import(AutoConfigurationImportSelector.Class)注解来加载配置类,并不是所有的bean都会被加载,在配置类或者bean中使用了@Condition注解来加载满足的bean.
@EnableAutoConfiguration给容器导入META-INFO/spring.factories里定义的自动配置类.
bean的循环依赖:
使用了三级缓存:
singletonObject(一级缓存): 单例对象的缓冲池,已经实例化并且属性赋值,成熟对象
earlySingleTonObject(二级缓存): 单例对象的缓冲池,已经实例化尚未属性赋值,半成品对象.
SingleTonFactory(三级缓存): 单例工厂的缓存
spring先从一级缓存singletonObject中获取,如果获取不到,并且对象正在创建中,再从二级缓存earlySingtonObject中获取,若是获取不到并且允许singletonFactory()经过getObject()中获取,则从三级缓存中获取,如果获取到了,就将三级缓存提升到二级缓存中.
RabbitMQ消息丢失及对应解决方案:
生产者丢失消息:开启confirm机制,等消费者接收到消息了再给生产者ack
MQ丢失消息: 开启RabbitMQ持久化, deliveryMode = 2 ,开启消息持久化
消费者丢失消息: 关闭RabbitMQ自动ack, 等处理完消息在手动ack.
Kafka:
消费端丢失消息:
关闭自动offset,等业务处理完再手动提交offset,但是有可能会出现重复消费,在业务中保证消息幂等就行
Kafka丢失消息:
设置partiton必须要有两个副本
设置ack = all,要求每条数据,必须写入所有replica之后,才能任务是写成功了.
生产者丢失消息:
设置ack = all,要求每条数据,必须写入所有replica之后,才能任务是写成功了.
线程池配置:
CPU密集型: CPU数目+一个线程
IO 密集型: 2倍CPU
CAP理论:
consistency 可用性
avalibility 可用性
partition 分区容错性
标签:缓存,对象,复习资料,获取,bean,实例,线程 From: https://www.cnblogs.com/rice89026824/p/17145289.html