Open 5pyx55CG5ri4 opened 3 months ago
arraylist new初始容量为0 空数组 add第一个元素 扩容到10 后续每次扩容1.5倍左右 底层是数组复制来实现
hashmap 1.7 数组+链表 1.8数组+链表+红黑树 初始容量16 负载因子0.75(意味着容量到了百分之75的时候扩容) 当出现hash冲突 会使用拉链法解决冲突 如果同一个hash结果 key不同 进入链表 如果链表长度达到8 则转化为红黑树 转换前会判断数组长度是否大于64 如果小于64则会先对数组进行扩容 hashmap每次扩容是2倍 2的次幂
继承线程类或者实现接口
准备状态 如new thred 未调用start方法时
就绪状态 调用了start方法 等待cpu资源
运行状态
阻塞状态 调用了sleep方法或者 wait方法
线程结束
核心线程数
最大线程数
工作阻塞队列
空闲线程存活时间
存活时间单位
拒绝策略
线程工厂(不重要)
一个任务进来 先开核心线程数是否超过设置的数量 如果没有 由核心线程执行任务如果核心线程数超过了设置的数量 则加入工作队列等待 如果 工作队列满了 并且没超过最大线程数 则开启临时新线程执行 临时线程存活时间由参数控制 回收 如果工作队列满了并且超过了最大线程数 则走拒绝策略
在每个线程中都有独立的一个thredlocalmap key为thredlocal value为存储的值 其中 key为弱引用 需要手动清理 否则可能会导致内存泄漏问题
sleep是thred类的方法 作用是 休眠当前线程 无需唤醒wait是object类方法 作用是是当前线程阻塞等待 在无参的方法中 需要等待别人唤醒
volatile 关键字修饰变量 可以保证变量对每个线程的可见性 不加关键字 线程中读取的变量为从主内存复制的副本 加了关键字修饰 则直接读取主内存中的值sychronized jvm提供的锁 为关键字 锁住的是对象头 分为 偏向锁 轻量级锁 自旋锁 重量级锁 是可重入锁 无法实现公平锁 无需手动释放锁reentrantLock 是类 java提供的锁api 底层是aqs 锁的是int类型的state值 可重入锁 可实现公平锁和非公平锁 无参构造的是非公平锁 需要手动释放锁
aqs底层是一个双向队列和一个state信号量 java juc基本都依赖aqs框架 主要维护 信号量放行的逻辑
比较并替换 可实现 乐观锁
加载:加载class文件
连接:1.验证 验证class文件合法性 2.准备 为变量设置内存并赋初始值 3.解析
初始化
加载类的时候 会先向父类加载器找有没有加载过这个类 如果没有 则继续往上 如果加载过了 则直接使用父类加载的结果 直到到达顶级 再向下尝试加载好处 保护程序稳定 防止重复加载 防止java 核心 api被篡改 如自己定义string类
自定义类加载器 重写加载方法
程序计数器 线程私有 记录代码运行位置 控制流程栈 分为虚拟机栈和本地方法栈 线程私有 方法开始压入栈帧 退出弹出栈帧 堆 线程共享 存储对象 gc重要位置 分为 新生代和老生代 新生代分为ende区 s0 s1 方法区/元空间 线程共享 存储 类信息 常量等信息直接内存
判断是否为垃圾的算法1.引用计数法 有对象引用时+1 引用被清理时-1 引用为0 则为垃圾 弊端 无法解决循环引用问题2.可达性分析法 从gc root开始往下找 找不到的对象均为垃圾 何为gcroot? 栈中引用的对象 方法区中静态属性和常量引用的对象 被同步锁持有的对象
垃圾回收算法:标记清除法 先标记需要清理的对象 再一次性回收 弊端 会造成大量的空间碎片 标记复制法 将内存分为两大块 将需要回收的对象复制到空的内存块 再清理 弊端 内存消耗过大标记整理法 将需要清理的内存标记 再将所有存活对象往一端移动 然后清理端边界的对象
垃圾回收器:串行垃圾回收器 原始版本 stw时间长 单线程垃圾回收 适用于小内存并行垃圾回收器 串行的衍生版本 唯一不同的是垃圾回收时 多线程并行 减少stw时间cmsg1
cpu负载过高大对象太多老年代内存不足导致 频繁full gc
控制反转和依赖注入 原理是反射
切面 原理是反射和动态代理 生成动态代理对象 可对方法执行前和执行后进行拦截做处理
单例 默认 bean容器中所有bean都是唯一的多例 每次获取都是一个新beanrequset 每个请求都是一个新beansession 每个session都是一个新bean
实例化
属性设置
前置处理
初始化处理
后置处理
使用中
销毁前置操作
死亡
请求过来 先到 调度servlet 由调度servlet找到处理器 handmapping 然后适配处理器 然后调用处理器找到对应的控制器 然后由控制器返回视图 渲染视图
Nacos 注册中心
Ribbon 负载均衡
OpenFeign 程序通信 http接口调用
Sentinel 降级 限流 服务保护
Gateway 网关 鉴权
Seata 分布式事务 二阶段提交 AT模式和TCC模式
共享锁 读锁 排他锁 写锁 间隙锁 行锁 表锁等
myisam和innodb的区别myisam 不支持事务 文件存储分为两个文件 索引文件和数据文件分开innodb 支持事务 文件存储 一个文件 索引和数据都在一个文件中 mysql默认
普通索引 唯一索引 innodb中的主键索引(聚簇索引,特殊的唯一索引),联合索引,全文索引 底层B+Tree 多叉平衡树 叶子节点中有指针相连 节点有序 索引覆盖 所需要查询的字段都建立了索引 不需要回表查询 最左匹配原则 如果联合索引 abc三个字段 那么查询的时候必须要有a这个字段的做为条件 才会走联合索引 因为存储索引的时候是按照从左往右按大小排序的
A原子性 同时成功同时失败 C 一致性 事务要保持最终一致性 一致性需要 其他三个特征来保证 I 隔离性 根据事务隔离级别控制 保证不同事务的隔离性 D 持久性 事务最终需要持久化到数据库中
读未提交 会产生脏读 级别最低 可以读到未提交的事务 读已提交 不可重复读 两次查询可能会产生不一样的结果 可重复读 mysql默认 会产生幻读 每次读取结果都一样 可串行化 级别最高 并发性能低 所有事务串行进行
在不可重复读和可重复读的事务隔离级别中有效 用来保证 事务的并发性原理是通过版本链来控制 在每个表中有两个隐藏字段 一个是事务id一个是上个版本的地址快照不可重复读中 每次查询都会生成新的 readView 所以会产生两次查询不一样可重复读中 会使用上次的readView 所以每次读取结果都一样
last:20240625 last:20240910
Java基础
集合
List
arraylist new初始容量为0 空数组 add第一个元素 扩容到10 后续每次扩容1.5倍左右 底层是数组复制来实现
map
hashmap 1.7 数组+链表 1.8数组+链表+红黑树
初始容量16 负载因子0.75(意味着容量到了百分之75的时候扩容) 当出现hash冲突 会使用拉链法解决冲突 如果同一个hash结果 key不同 进入链表 如果链表长度达到8 则转化为红黑树 转换前会判断数组长度是否大于64 如果小于64则会先对数组进行扩容 hashmap每次扩容是2倍 2的次幂
io
多线程
开启多线程的几种方式
继承线程类或者实现接口
线程的生命周期
准备状态 如new thred 未调用start方法时
就绪状态 调用了start方法 等待cpu资源
运行状态
阻塞状态 调用了sleep方法或者 wait方法
线程结束
线程池参数
核心线程数
最大线程数
工作阻塞队列
空闲线程存活时间
存活时间单位
拒绝策略
线程工厂(不重要)
线程池执行流程
一个任务进来 先开核心线程数是否超过设置的数量 如果没有 由核心线程执行任务如果核心线程数超过了设置的数量 则加入工作队列等待 如果 工作队列满了 并且没超过最大线程数 则开启临时新线程执行 临时线程存活时间由参数控制 回收 如果工作队列满了并且超过了最大线程数 则走拒绝策略
ThredLocal
在每个线程中都有独立的一个thredlocalmap key为thredlocal value为存储的值 其中 key为弱引用 需要手动清理 否则可能会导致内存泄漏问题
sleep,wait
sleep是thred类的方法 作用是 休眠当前线程 无需唤醒
wait是object类方法 作用是是当前线程阻塞等待 在无参的方法中 需要等待别人唤醒
锁机制
volatile,sychronized和reentrantLock
volatile 关键字修饰变量 可以保证变量对每个线程的可见性 不加关键字 线程中读取的变量为从主内存复制的副本 加了关键字修饰 则直接读取主内存中的值
sychronized jvm提供的锁 为关键字 锁住的是对象头 分为 偏向锁 轻量级锁 自旋锁 重量级锁 是可重入锁 无法实现公平锁 无需手动释放锁
reentrantLock 是类 java提供的锁api 底层是aqs 锁的是int类型的state值 可重入锁 可实现公平锁和非公平锁 无参构造的是非公平锁 需要手动释放锁
AQS
aqs底层是一个双向队列和一个state信号量 java juc基本都依赖aqs框架 主要维护 信号量放行的逻辑
CAS
比较并替换 可实现 乐观锁
类加载机制
类加载过程
加载:加载class文件
连接:1.验证 验证class文件合法性 2.准备 为变量设置内存并赋初始值 3.解析
初始化
双亲委派机制
加载类的时候 会先向父类加载器找有没有加载过这个类 如果没有 则继续往上 如果加载过了 则直接使用父类加载的结果 直到到达顶级 再向下尝试加载
好处 保护程序稳定 防止重复加载 防止java 核心 api被篡改 如自己定义string类
如何打破双亲委派
自定义类加载器 重写加载方法
JVM
内存区域
程序计数器 线程私有 记录代码运行位置 控制流程
栈 分为虚拟机栈和本地方法栈 线程私有 方法开始压入栈帧 退出弹出栈帧
堆 线程共享 存储对象 gc重要位置 分为 新生代和老生代 新生代分为ende区 s0 s1
方法区/元空间 线程共享 存储 类信息 常量等信息
直接内存
GC
判断是否为垃圾的算法
1.引用计数法 有对象引用时+1 引用被清理时-1 引用为0 则为垃圾 弊端 无法解决循环引用问题
2.可达性分析法 从gc root开始往下找 找不到的对象均为垃圾 何为gcroot? 栈中引用的对象 方法区中静态属性和常量引用的对象 被同步锁持有的对象
垃圾回收算法:
标记清除法 先标记需要清理的对象 再一次性回收 弊端 会造成大量的空间碎片
标记复制法 将内存分为两大块 将需要回收的对象复制到空的内存块 再清理 弊端 内存消耗过大
标记整理法 将需要清理的内存标记 再将所有存活对象往一端移动 然后清理端边界的对象
垃圾回收器:
串行垃圾回收器 原始版本 stw时间长 单线程垃圾回收 适用于小内存
并行垃圾回收器 串行的衍生版本 唯一不同的是垃圾回收时 多线程并行 减少stw时间
cms
g1
频繁出现GC的原因
cpu负载过高
大对象太多
老年代内存不足导致 频繁full gc
spring
ioc
控制反转和依赖注入 原理是反射
aop
切面 原理是反射和动态代理 生成动态代理对象 可对方法执行前和执行后进行拦截做处理
bean的作用域
单例 默认 bean容器中所有bean都是唯一的
多例 每次获取都是一个新bean
requset 每个请求都是一个新bean
session 每个session都是一个新bean
bean的生命周期
实例化
属性设置
前置处理
初始化处理
后置处理
使用中
销毁前置操作
死亡
springmvc
springmvc执行流程
请求过来 先到 调度servlet 由调度servlet找到处理器 handmapping 然后适配处理器 然后调用处理器找到对应的控制器 然后由控制器返回视图 渲染视图
springboot
springcloud
Nacos 注册中心
Ribbon 负载均衡
OpenFeign 程序通信 http接口调用
Sentinel 降级 限流 服务保护
Gateway 网关 鉴权
Seata 分布式事务 二阶段提交 AT模式和TCC模式
mybatis
redis
mq
事务消费
顺序消费
mysql
常见锁
共享锁 读锁 排他锁 写锁 间隙锁 行锁 表锁等
数据引擎
myisam和innodb的区别
myisam 不支持事务 文件存储分为两个文件 索引文件和数据文件分开
innodb 支持事务 文件存储 一个文件 索引和数据都在一个文件中 mysql默认
索引
普通索引 唯一索引 innodb中的主键索引(聚簇索引,特殊的唯一索引),联合索引,全文索引
底层B+Tree 多叉平衡树 叶子节点中有指针相连 节点有序
索引覆盖 所需要查询的字段都建立了索引 不需要回表查询
最左匹配原则 如果联合索引 abc三个字段 那么查询的时候必须要有a这个字段的做为条件 才会走联合索引 因为存储索引的时候是按照从左往右按大小排序的
事务特征
A原子性 同时成功同时失败
C 一致性 事务要保持最终一致性 一致性需要 其他三个特征来保证
I 隔离性 根据事务隔离级别控制 保证不同事务的隔离性
D 持久性 事务最终需要持久化到数据库中
事务隔离级别
读未提交 会产生脏读 级别最低 可以读到未提交的事务
读已提交 不可重复读 两次查询可能会产生不一样的结果
可重复读 mysql默认 会产生幻读 每次读取结果都一样
可串行化 级别最高 并发性能低 所有事务串行进行
mvcc
在不可重复读和可重复读的事务隔离级别中有效 用来保证 事务的并发性
原理是通过版本链来控制 在每个表中有两个隐藏字段 一个是事务id一个是上个版本的地址快照
不可重复读中 每次查询都会生成新的 readView 所以会产生两次查询不一样
可重复读中 会使用上次的readView 所以每次读取结果都一样
mysql 锁等待超时
limit 大数据量优化
liunx
数据加密
last:20240625last:20240910