JAVA体系
2024-09-19 01:49:38 0 举报
AI智能生成
登录查看完整内容
JAVA体系
作者其他创作
大纲/内容
图灵机工作模式
冯诺依曼模型
线路位宽与cpu位宽
程序执行基本过程
cpu如何执行程序
层次结构
层次关系
价格与性能
存储器
cpu cache
数据结构与读取过程
如何写出让cpu跑的更快的代码
充分利用CPU
cpu cache 数据写入
缓存一致性问题
总线嗅探
MESI 协议
cpu缓存一致性
读写数据
选择线程
cpu如何执行任务
什么是中断
软中断
定位软中断cpu使用过高
cpu
计算机内存管理基础
虚拟内存
内存分段
内存分页
段页式内存管理
linux 内存管理
内存分配过程
可以被回收的内存
回收内存带来的性能影响
如何保护一个进程不被OOM杀掉
内存满了怎么样
什么是预读失效和缓存污染
Linux和MySql的缓存
传统LRU算法的问题
预读失效和缓存污染如何处理
预读失效和缓存污染
相关问题
内存管理
进程的概念
进程的控制结构
进程的控制
进程上下文切换
线程
调度
基本概念
管道
消息队列
共享内存
信号量
信号
Socket
进程间的通信
竞争和协作
互斥和同步
经典同步问题
线程冲突
死锁概念
模拟死锁
排查死锁
避免死锁
悲观锁、乐观锁
进程管理
进程调度算法
页面置换算法
磁盘调度算法
调度算法
各种概念
多路复用
Reactor和Proactor
IO
白话理解
文件系统的组成
虚拟文件系统
文件的使用和存储
文件系统的结构
目录的存储
软硬链接
空闲空间管理
文件IO
文件系统
系统
语音
视频
直播
UDP
模型
链接建立与断开
syn seq
syn ack seq
ack seq
为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
三次握手
fin ack seq
ack seqfin ack seq
四次挥手
重传机制
滑动窗口
流量控制
拥塞控制
复杂问题
网络会话
文件传输
发送接收邮件
远程登录
场景
TCP基础
基础
状态码
字段和特性
HTTP
为啥安全
HTTPS
阻塞等待链接
阻塞等待数据
开线程处理并发
耗资源
BIO
非阻塞IO
epoll
NIO
在报文末尾增加换行符表明一条完整的消息,这样在接收端可以根据这个换行符来判断消息是否完整。将消息分为消息头、消息体。可以在消息头中声明消息的长度,根据这个长度来获取报文(比如 808 协议)。规定好报文长度,不足的空位补齐,取的时候按照长度截取即可。
粘包拆包
单个进程可监视的fd数量被限制,即能监听端口的大小有限。
对socket进行扫描时是线性扫描,即采用轮询的方法,效率较低:
需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大
select
大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义
poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd。
poll
没有最大并发连接的限制,能打开的FD的上限远大于1024(1G的内存上能监听约10万个端口);
效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。
内存拷贝,利用mmap()文件映射内存加速与内核空间的消息传递;即epoll使用mmap减少复制开销。
netty 非异步
网络
排序
二分
高精度
位运算
前缀
双指针
离散化
区间合并
基础算法
链表邻接表
栈和队列
kmp
trie
并查集
堆
hash表
数据结构
DFS与BFS
树与图的遍历:拓扑排序
最短路
最小生成树
二分图:染色法、匈牙利算法
搜索与图论
质数
约数
欧拉函数
快速幂
扩展欧几里得算法
中国剩余定理
高斯消元
组合计数
容斥原理
简单博弈论
数学知识
背包问题
线性DP
区间DP
计数类DP
数位统计DP
状态压缩DP
树形DP
记忆化搜索
动态规划
贪心
时空复杂度分析
基础部分
数字三角形模型
最长上升子序列模型
背包模型
状态机模型
数位DP
斜率优化的DP问题
四边形不等式优化
Flood Fill
最短路模型
多源BFS
最小步数模型
双端队列广搜
双向广搜
A*
BFS
连通性模型
搜索顺序
剪枝与优化
迭代加深
双向DFS
IDA*
DFS
搜索
单源最短路的建图方式
单源最短路的综合应用
单源最短路的扩展应用
最小生成树的典型应用
最小生成树的扩展应用
floyd算法及其变形
SPFA求负环
差分约束
最近公共祖先
有向图的强连通分量
无向图的双连通分量
二分图
欧拉回路和欧拉路径
拓扑排序
网络流
最小割
图论
树状数组
线段树
平衡树——Treap
AC自动机
后缀数组
高级数据结构
二维计算几何基础
凸包
半平面交
最小圆覆盖
三维计算几何基础
三维凸包
旋转卡壳
三角剖分
扫描线
自适应辛普森积分
计算几何
进阶
数据结构与算法
发展简史
主要特性
技术体系与平台介绍
java核心机制与JVM运行原理
DOS常见命令
搭建开发环境
开发第一个程序
程序执行原理
字节码反编译
初识Java
进制转换
标识符与字节编码
常量变量
八大基本数据类型
final常量
Scanner
各种运算符
自动类型转换
数据类型和运算符
执行流程介绍
if选择结构
switch多重选择结构
while
do while
for
循环结构
随机数
break
continue
return
跳转语句
多重循环
方法声明与使用
流程控制
数组介绍
优缺点分析
创建与使用
初始化与内存分析
二维数组
Arrays工具类
数组常见算法
数组
面向对象与面向过程
类和对象
属性和方法
对象内存分析
构造方法及其重载
对象类型参数传递
this关键字
static关键字
代码块
包package和import详解
javaDoc
面向对象基础
访问权限修饰符
封装
Object类
方法重写
super关键字
重写equals和toString
继承
向上转型
向下转型
instanceOf关键字
多态
面向对象三大特性
final修饰符
抽象类和抽象方法
接口新特性
接口应用
接口
内部类
内存管理与垃圾回收
面向对象进阶
面向对象编程
异常概述
执行过程分析
try catch finally
throw抛出异常
throws声明异常
异常继承体系
运行时异常和编译异常
自定义异常
异常机制
Wrapper包装类
自动拆箱装箱
StringBuffer
StringBuilder
字符串处理类性能分析
String类
Date和DateFormat
Calendar类
Math和Random
BigDecimal
枚举
File类
Java常用类
集合和数组的联系和区别
ArrayList的使用和源码分析
LinkedList的使用和源码分析
List
HashSet的使用和源码分析
TreeSet的使用和源码分析
Set
数组+链表
头插
1.7
数组+链表+红黑树
尾插
1.8
LoadFactory 默认0.75
Hash公式跟长度有关
创建一个空数组重新Hash
扩容机制
方便位运算
均匀分布
2的幂次
重写equals必须重写HashCode
HashMap的使用和源码分析
TreeMap的使用和源码分析
Map
集合框架体系
Iterator与ListIterator
Collections工具类
比较器Comparable和Comparator
旧集合类Vector、Hashtable
集合中使用泛型
泛型接口
泛型类
泛型方法
泛型
集合(容器)
IO流的概念
IO流的分类及其原理分析
文件流FileInputStream、FileOutputStream
缓冲流BufferedInputStream、BufferedOutputStream
数据流DataInputStream、DataOutputStream
对象流ObjectInputStream、ObjectOutputStream
转换流InputStreamReader、OutputStreamWriter
打印流PrintWriter和PrintStream
内存流ByteArrayOutputStream、ByteArrayInputStream
各种IO流
序列化和反序列化
IO流
Java反射机制
反射的原理分析
获取Class实例的几种方式比较
Constructor
Field
Method
从Class中获取类的结构信息
开启反射的源头Class
使用反射突破泛型的限制
使用反射读取泛型
使用反射获取数组元素类型
理解内置注解和元注解
自定义注解
使用反射读取注解
注解
反射和注解
进程和线程
线程的创建与启动
创建线程的三种方式对比
线程的生命周期
线程控制
多线程的安全问题与解决办法
同步代码块
同步方法
Lock同步
线程的同步
线程的死锁问题
线程通信
Condition
初级多线程
Mark Word(存储对象的HashCode,分代年龄和锁标志位信息。)
Klass Point(对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。)
EntryList
Owner(会指向持有 Monitor 对象的线程)
WaitSet
Monitor
对象头(Header)
实例数据
对其填充
对象
ACC_SYNCHRONIZED
方法
monitorenter
monitorexit
加减
程序计数器 count
无锁
mark Word 中有线程信息 cas 比较
偏向锁
复制了一份mark work 叫 Lock record 也是cas尝试改变指针
轻量级
死循环
自旋
重量级
锁膨胀
as-if-serial
happens-before
有序性
内存强制刷新
可见性
单一线程持有
原子性
计数器
可重入性
特性保证
用户态内核态切换
重锁
synchronized是关键字,是JVM层面的底层啥都帮我们做了,而Lock是一个接口,是JDK层面的有丰富的API。synchronized会自动释放锁,而Lock必须手动释放锁。synchronized是不可中断的,Lock可以中断也可以不中断。通过Lock可以知道线程有没有拿到锁,而synchronized不能。synchronized能锁住方法和代码块,而Lock只能锁住代码块。Lock可以使用读锁提高多线程读效率。synchronized是非公平锁,ReentrantLock可以控制是否是公平锁。
锁升级不可逆
劣势
sync 和 Lock的区别
synchronized
内存泄露
session
ThreadLocal
ReadLock
WriteLock
ReentrantReadWriteLock
tryAcquire
acquireQueued
CAS
NonfairSync
hasQueuedPredecessors
如果是当前持有锁的线程 可重入
FairSync
入队 出队
头结点设计
共享和独享的实现
实际应用
cpu开销
AtomicReference
只能保证一个共享变量原子操作
标志位 时间戳
ABA
存在的问题
AbstractQueuedSynchronizer
ReentrantLock
StampedLock
Lock
当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取
锁bus
总线风暴
volitale会一直嗅探 cas 不断循环无效交互 导致带宽达到峰值
MESI
高速缓存
Java内存模型JMM
处理器嗅探总线
嗅探机制 强制失效
源代码-编译器优化重排序-指令级并行重排序-内存系统重排序-最终执行的指令序列
lock 前缀指令 内存屏障
禁止指令重排序
volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。
AtomicInteger
跳出死循环
volatile
wait/notify 机制,共享变量的 synchronized 或者 Lock 同步机制等。
CountDownLatch
CyclicBarrier
线程间是怎么进行通信的?
可以从尽量减少临界区范围,使用 ThreadLocal,减少线程切换、使用读写锁或 copyonwrite 等机制这些方面来回答。
ThreadLocal 用来解决什么问题?
ThreadLocal 是如何实现的?可以重点回答 ThreadLocal 不是用来解决多线程共享变量的问题,而是用来解决线程数据隔离
如何尽可能提高多线程并发性能?
可以回答读写锁适合读并发多,写并发少的场景,另外一个解决这种场景的方法是 copyonwrite。
读写锁适用于什么场景?
可以尝试通过锁、信号量、线程通信、阻塞队列等不同方式实现。
如何实现一个生产者与消费者模型?
常见问题
newFixedThreadPool
SynchronousQueue
newCacheThreadPool
newSIngleTheadExecutor
DelayedWorkQueue
newScheduledThewadPool
newWorkStealingPool
ThreadPoolExecutor
默认没线程等任务来了才调用 除非调用了 预创建线程 一个或者全部
核心线程数
最大线程数
没有执行任务多久会终止 当线程池的线程数大于核心线程才会起作用 调用allowCoreThreadTimeOut会起作用
空闲时间&单位
无界 当心内存溢出
LinkedBlockingQueue
有界队列
加锁保证安全 一直死循环阻塞 队列不满就唤醒
在进行某项业务存储操作时,建议采用offer进行添加,可及时获取boolean进行判断,如用put要考虑阻塞情况(队列的出队操作慢于进队操作),资源占用。
入队
ArrayBlockingQueue
Synchronous
缓冲队列
工厂方法
抛异常
丢弃
重试
丢弃最早提交的
拒绝策略
使用Has表维护线程的引用
使用future获取任务的执行结果
submit
参数意义
商品详情界面
批处理
实际使用
核心线程-队列-最大线程-拒绝策略
执行过程
running
shutdown
stop
所有线程销毁
terminated
有个Volatile的状态码
corePoolSize、maximumPoolSize、largestPoolSize 有意思
运行状态
故障
线程池
高级多线程
如何基于不可变模式解决并发问题
实现智能安防系统的报警功能
模拟点餐系统中两阶段终止模式的运用
基于Promise模式对云网盘进行改造,提升性能
基于生产者和消费模式对交易平台进行改造,完成性能优化
如何基于主动对象模式,完成对移动互联网短网址服务改造
如何利用线程池实现互联网验证码保护服务
动手实现一个可发送短信随机密码的高安全性用户密码系统
如何实现一个用于分析excel报表文件商业智能BI系统
基于主仆模式优化电商平台热点商品分析系统
在电商平台页面静态化系统中实现上传静态化页面到nginx
基于半同步-半异步模式,优化广告计费预警系统
多线程案例剖析
多线程
基于java进行网络编程
网络编程
核心Java
数据库基础知识
MySQL基础知识
安装和卸载MySQL
使用navicat访问数据库
SQL语言入门
创建数据库表
DML
修改删除数据库表
表的完整性约束
表的外键约束
基本select查询
where子句
函数
group by
having
内连接
外连接
自连接
SQL99-连接查询
SQL92-连接查询
相关子查询
不相关子查询
子查询
分页查询
MySQL 查询语句
索引
事物
视图
存储过程
导入导出
触发器
存储函数
定时任务
数据库对象
MySQL基础
系统架构
目录结构
字符集与排序规则
配置修改
MySQL架构
磁盘结构
容量计算
读取响应时间
交换单位
局部性原理与磁盘预读
IO成本
系统表空间
独立表空间
其他表空间
InnoDb数据存储
数据存储
组织结构
COMPACT
REDUNDANT
行记录格式
IO和存储
内部结构
怎么知道数据页是否被缓存
Free 链
脏页
链表结构
刷盘时机
flush链表
LRU链表
Buffer Pool
简介
外部临时表
内部临时表
group by 执行流程
内部临时表创建时机
分类
MySQL临时表
事物简介
显示、隐式事物
只读、读写事物
保存点
事物分类
原子性Atomicity
一致性Consistency
隔离性Isolation
持久性Durability
事物四大特征ACID
读未提交
读已提交
可重复读
串行化
事物隔离级别
MySQL事物
B-树
B+树
选型缘由
发现索引
聚簇索引和非聚簇索引
普通索引
唯一索引
多个二级索引的组合使用
复合索引
全文索引
hash索引
空间索引
索引的分类和创建
各种字段
explain
什么情况适合或不适合建立索引
能用复合索引的要用复合索引
null值也可以走索引
使用短索引
排序的索引问题
MySQL索引失效的情况
使用索引的问题
全库逻辑备份
全局锁
lock table read/write
MySQL5.5引入 自动添加读锁不互斥 写锁互斥
MySQL的information_schema 库的 innodb_trx 表 找到对应长事务 kill掉
alter table里面设定等待时间
多个事务之前操作,如果查询的时候修改字段容易让线程池饱满
MDL(metadata lock)
Myisam是不支持表锁的
表锁
需要的时候才加上 并不是马上释放 等事务结束才释放 两阶段锁协议
默认是50s太久 但是如果设置太短会误判 一般采用死锁监测
innodb_lock_wait_timeout
超时时间
innodb_deadlock_detect = on
死锁机制 事务回滚
死锁
关掉死锁会出现大量重试
临时关闭
死锁消耗CPU
更多的机器 开启比较少的线程 消耗就少了
控制并发度
分治
热点行
行锁
间隙锁
lock in share mode
for update
读
写
读写锁
innodb如何加锁
锁
概述
数据恢复
格式分类
日志格式
binlog刷盘
binlog主从同步
binlog日志
通用日志
慢查询日志
错误日志
其他日志
事物id
roll pointer
物理存储结构
记录流程
回滚流程
redo log日志
日志系统
实现原理
结构
Read view
快照读取原理解析
解决脏读
解决不可重复读
解决幻象读
解决脏读和不可重复读
版本链 在聚集索引中 有两个隐藏列 trx_id roll_pointer
直接读取最新版本
加锁
序列化
每次读取前生成一个
第一次生成一个
可重复度
Read View
MVCC
隔离级别和MVCC
水平切分
垂直切分
Sharding策略
分库分表
MySQL进阶
MySQL驱动到底是什么
数据库连接池到底用来干什么
MySQL的连接池用来干什么
系统如何跟mysql打交道
网络连接必须线程处理
sql接口
查询解析器
查询优化器
存储引擎接口
执行器
执行sql语句,mysql用了什么样的架构设计
1)为什么需要缓冲池buffer pool
12)怎么使用缓冲池
事务没提交,更新的数据要回滚怎么办
InnoDB存储引擎的架构设计
RAID卡缓存的问题
RAID存储定期性能抖动
Too many connections故障
大量脏页刷盘带来的性能抖动
排序的时候怎么样才能使用上索引
where和order by冲突怎么建立索引
低基数字段筛选+其他字段排序
社交app实战案例
千万级用户场景下的sql调优
亿级数量商品场景下的sql调优
千万级数据删除导致的慢查询
用户表水平拆分
订单数据库设计
跨库分页
再次扩容
MySQL案例
MySQL
HTML\\CSS\\JAVASCRIPT\\JQuery
B/S和C/S架构简介
web开发概述
Tomcat
Servlet快速入门
Servlet生命周期
读取配置文件信息
HttpServletRequest
HttpServletResponse
GET和POST区别
解决中文乱码
请求转发与重定向
绝对路径和相对路径
Cookie
Session
ServletContext
ServletConfig
Servlet系列内容
Servlet
JSP技术介绍
JSP的执行过程
scriptlet
表达式
声明
JSP指令元素
JSP动作元素
JSP隐式对象
JSP底层原理
九大内置对象
四个作用域
JSP系列内容
Servlet和JSP的关系和区别
MVC模式
合并Servlet
EL+JSTL+过滤器+监听器
JSP
Ajax异步请求和局部刷新的原理
使用原生Ajax验证用户唯一性
jQuery Ajax
ajax各种案例
AJAX和Json
分页和文件上传/下载
web
MyBatis概述
入门配置
基本的CRUD操作
核心配置文件详解
Mapper.xml基础详解
模糊查询
分页的实现及插件PageHelper的使用
动态sql+sql片段的使用
一对多、多对一的关系处理
注解的使用
一级缓存和二级缓存说明及使用
generator逆向工程使用
MyBatis
单例
工厂
根据不同商家适配
适配器
继承 process 链路执行
责任链
设计模式
源码
invokeBeanFactoryPostProcessors
扫描类
封装beanDefinition对象 各种信息
放到map
遍历map
能不能实例化 需要实例化么 根据信息来
是否单例等等
判断是不是factory bean
单例池 只是一个ConcurrentHashMap而已
正在创建的 容器
验证
得到 class
根据注入模型
默认
推断构造方法
得到构造方法
反射 实例化这个对象
后置处理器合并beanDefinition
判断是否允许 循环依赖
提前暴露bean工厂对象
自动注入
填充属性
执行部分 aware 接口
继续执行部分 aware 接口 生命周期回调方法
完成代理AOP
beanProstprocessor 的前置方法
实例化为bean
放到单例池
销毁
生命周期
单例(singleton)
多例(prototype)
Request
作用域
Bean
属性注入可以破解
三级缓存没自己 因二级之后去加载B了
构造器不行
情况
去单例池拿
判断是不是正在被创建的
判断是否 支持循环依赖
二级缓存 放到 三级缓存
GC
干掉二级缓存
下次再来直接 三级缓存拿 缓存
三级缓存
一级缓存 单例Bean
产生bean 复杂
二级缓存 工厂 产生baen
三级缓存 半成品
缓存 存放
循环依赖
父子容器
采用不同的连接器
共享链接
用AOP 新建立了一个 链接
ThreadLocal 当前事务
前提是 关闭AutoCommit
事务实现原理
实现类
静态代理
调用具体方法的时候调用invokeHandler
java反射机制生成一个代理接口的匿名类
实现接口
JDK动态代理
修改字节码生成子类去处理
asm字节码编辑技术动态创建类 基于classLoad装载
cjlib
动态代理
AOP
IOC
生成一个class对象
加载
文件格式验证
元数据验证
字节码验证
符号引用验证
默认值
static会分配内存
准备
引用等
解析具体类的信息
解析
父类没初始化 先初始化父类
初始化
使用
卸载
过程
main()
class。forName
ClassLoader。loadClass
加载方式
Appclass Loade
Extention ClassLoader
Bootstrap ClassLoader
类加载器
可以避免重复加载
安全
双亲委派原则
类加载机制
Spring
spring
MVC架构模式
手写MVC框架
SpringMVC简介
SpringMVC运行原理
基于配置文件方式搭建环境
基于注解方式搭建环境
SpringMVC的跳转及视图解析器的配置
SpringMVC和Ajax的交互
Spring 参数注入
SpringMVC作用域传值
视图解析器
文件下载
文件上传
Spring拦截器/拦截器栈
登录状态验证
SpringMVC容器和Spring容器介绍
异常处理4种方式
SpringMVC5其他常用注解
SpringMVC
Maven简介
Maven原理
Linux安装及注意事项
Maven项目结构
POM模型
Maven 中项目类型
创建WAR类型的Maven项目
scope属性可取值
SSM项目拆分演示
Maven的常见插件讲解
热部署
Maven
BootStrap概述
BootStrap栅格系统
BootStrap常用全局CSS样式
常用组件
BootStrap
Spring Boot简介
Spring Boot实现Spring MVC
配置文件顺序及类型讲解
Spring Boot项目结构
Spring Boot 整合 其他组件
Spring Boot 开发者工具
Spring Boot 异常显示页面
Spring Boot 项目打包部署
SpringBoot
框架
Linux简介
Linux目录结构及路径
Linux常用命令
XShell安装及使用
各种环境搭建
Linux
Docker简介
Docker与VM对比
Docker安装与启动
镜像加速器配置
Docker镜像操作常用命令
Docker容器操作常用命令
DockerFile
搭建本地镜像仓库
推送镜像到阿里云及本地仓库
Docker数据管理
Docker
无状态模式
broker向发心跳顺便带上所有的Topic信息
早期是zk后来改了
NameServer
中转消息,消息持久化
底层通信基于Netty
Broker
同步
异步
单向
Producer
pull
push
Consumer
基础组成
多master
多master多slave异步复制
多master多slave双写
支持集群模式
发送成功后返回consume_success
回溯消费
消费保证
NameService 集群
Broker 主从 双主 双从
Consumer 自动切换
producer 链接两个Broker
集群
同步 超时会返回错误
异步 不返回
刷盘
同步复制
异步复制
消息的主从复制
主从同步 异步刷盘
高可用
消费者是多线程
顺序发送 顺序消费由 消费者保证
RocketMQ提供了MessageQueueSelector队列选择机制
Hash取模
顺序消息
幂等
消息表主键冲突
去重
消息去重
消息表 不断轮训 人工干预
最大努力
发送半消息 发送成功 本地事务 觉得是否提交还是回滚 服务端没收到回查 检查本地事务 根据本地事务决定 提交
半消息
2/3pc
预发 持久化 返回状态 发送处理结果 判断是否干掉持久化的 发送
最终一致
分布式事务
producer 和NameService 节点建立一个长连接
定期从NameService获取Topic信息
并且向Broker Master 建立链接 发送心跳
发送消息给 Broker Master
consumer 从 Mater 和 Slave 一起订阅消息
完整的一个调用链路
不断重试 16次 4小时46分钟 可以修改尝试次数
对一个消费者设置 组内都会设置
可以获取消息重试次数
顺序消息重试
无序消息重试
消息重试
不再被正常消费
保存3天
面向消费者组
控制台 重发 重写消费者 单独消费
死信队列
事务消息
消息丢失
决定是否丢弃
判断吞吐量
停止消费 加机器 加topic
消息积压
RocketMQ
羊群效应
临时节点顺序
性能没redis高
Zookeeper
性能比较高
Redis
设置一个失效时间用定时任务去跑
数据库集群 主备同步
搞个死循环排队
可重入设计一个字段累加
用数据库自身的锁就可以了 行锁 索引
select XX for update
记得 提交
宕机数据库也会自动释放锁
排它锁
比其他的更消耗资源
复杂
缺点
数据库
互斥
安全性
容错
特点
分布式锁
零拷贝
阻塞IO 读写都阻塞
问题 带宽 资源等
每个请求过来 开一个线程阻塞
bio
不阻塞来着不拒
程序注册一组socket文件描述符给操作系统,表示“我要监视这些fd是否有IO事件发生,有了就告诉程序处理”
便捷的通知机制
IO多路复用
遍历 判断事件是否可达 然后继续
做了优化
有转态 会创建 文件描述符指向的表 监听增删改查
但是可能等待时间太久 响应延迟大了 太短了 会重试
监听事件
通道 buffer 多路复用
nio
aio
架构设计思路
初始化channel
任务队列
注册 channel到selector
轮训accept事件 处理这些简历 channel的链接
注册 channel到selector 接收方
轮训写 事件 开线程去处理
执行链路
监听端口所有准备就绪的时间
boss
监听准备工作
work
线程组
Netty
调用链路
IOC 启动加载dubbo配置的标签
解析标签 ServiceBean 会生成一个Bean
get provider
set provider
各种信息 保存在 ServiceBean
afterpropertiesSet
实现了 initializingBean
是否暴露 不是延迟暴露
回调onapplicationEvent
IOC完成 还实现了一个 ApplicationListener监听器
检查
加载注册中心信息
根据spi来
本地暴露
打开 服务器 exchangeServer
启动服务器netty 监听端口
注册表
注册中心 注册服务
暴露 p 和 s 两个invoker的map保存了地址
暴露invoke
spi
代理工厂获取invoke 封装
循环协议 端口
doexportURL 暴露URL
信息校验 doexport
暴露
服务暴露过程
init
factoryBean -getObject -get
创建代理对象 createProxy
信息检查
dubbo 执行远程引用
远程引用 获取到zk 获取到信息 订阅
注册到注册表进去
返回invoke
创建 netty客户端
成功
服务引用
Java 没ioc aop
java spi
具体的spi kv形式
SPI
直接切换
failover
快速失败
failfast
failsafe
failback
forking cluster
broadcast cluster
失败回调
返回默认
整合 hystrix
容错机制
return null
失败返回空
降级
随机 加权
轮训
最少活跃数
hash一致
负载均衡
选举算法
注册中心
默认 nio 单一长连接
二进制系列化 小数据量 100k
数据量中等 不适合文件传输
dubbo
memcached
redis
webService
http
协议
Dubbo
String
Hash
set
score
只需要调整前后节点指针
随机层数
还会比较value
不止比较score
成绩
积分
排行榜
zset
分页的坑
HyperLogLog
Geo
Pub/Sub
BitMap
键值的底层都是SDS
AOF缓存区
记录本身长度 C需要遍历
空间预支配
惰性空间释放
修改字符减少内存重新分配
C只能保存文本数据 无法保存图片等二进制数据
sds是使用长度去判断
二进制安全
杜绝缓冲区溢出
兼容部分C字符串函数
SDS
保存多个客户端的状态信息
列表订阅发布 慢查询 监视器
链表
数据库 哈希键
Hash表节点
hash冲突用单向链表解决
会逐渐rehash 新的键值对全部放到新的hash表
渐进式 rehash
一个平时用 一个rehash时候用
每个字典带 两个hash表
字典
压缩列表
整数集合
底层
Keys
setnx
exprie
常见命令
5分钟一次
冷备
恢复的时候比较快
快照文件生成时间久,消耗cpu
RDB
appendOnly
数据齐全
回复慢文件大
AOF
从节点发送命令主节点做bgsave同时开启buffer
数据初始化
持久化
offset
指令流
主从同步
缓冲区
快照同步
数据同步机制
集群监控
消息通知
故障转移
配置中心
脑裂
哨兵
横向扩容
多主
分片
加随机值
集群部署
缓存雪崩
互斥锁
热点数据不失效
缓存击穿
布隆过滤器
缓存穿透
延时双删
双写一致性
并发竞争
bigkey命令 找到干掉
Redis 4.0引入了memory usage命令和lazyfree机制
大Key
缓存时间不失效
多级缓存
读写分离
热点key
创建一个定时器
消耗内存
定时删除
可能存在大量key
惰性删除
检查 删除 但是是随机的
定期删除
过期策略
最少使用
LUR
淘汰机制
主从+哨兵+cluster
ecache+Hystrix+降级+熔断+隔离
备用方案
setnx ex
窗口滑动
zset会越来越大
定时push
然后leftpop
空连接异常
blpop
空轮训
问题
令牌
Redis-Cell
原子性有问题
make_space 灌水之前调用漏水 腾出空间 取决于流水速率
漏桶 funnel
redis cell
限流
二级缓存
备份热key 走不同的机器
选择方案
跳跃表
漏桶
scan
扩展
read得读到很多才返回 为0会卡在那 直到新数据来或者链接关闭
写不会阻塞除非缓冲区满了
非阻塞的IO 提供了一个选项 no_blocking 读写都不会阻塞 读多少写多少 取决于内核的套接字字节分配
非阻塞IO也有问题 线程要读数据 读了一点就返回了 线程什么时候知道继续读?写一样
一般都是select解决 但是性能低 现在都是epoll
多路IO复用
栈
方法区
本地方法栈
程序计数器
JVM内存模型
加载-验证-准备-解析-初始化-使用-卸载
父类加载 不重复加载
Eden/s1/s2
年轻代
老年代
永久代/元空间
根据存活时间
晋升机制
分代回收
对象存活比较多的时候适用
适用场景
提前GC
碎片空间
标记存活对象
清除没有标记的对象
扫描了两次
标记清除
存活对象少 比较高效
扫描了整个空间(标记存活对象并复制异动)
适合年轻代
适合场景
需要空闲空间
需要复制移动对象
标记复制
没办法解决循环引用的问题
引用计数
标记整理
垃圾回收机制
edan
s1
s2
通过阈值晋升
minor gc
年轻
major gc 等价于 full gc
老年
永久
分代
对cpu资源敏感
无法处理浮动垃圾
基于标记清除算法 大量空间碎片
CMS
分区概念 弱化分代
标记整理算法 不会产生空间碎片 分配大对象不会提前full gc
可以设置预设停顿时间
充分利用cpu 多核条件下 缩短stw
初始标记 stw 从gc root 开始直接可达的对象
可达性分析算法
并发标记 gc root 对对象进行可达性分析 找出存活对象
最终标记
根据用户期待的gc停顿时间指定回收计划
筛选回收
收集步骤
复制一些存活对象到old区s区
回收所有的eden s区
young gc
mixed gc
回收模式
GC模式
G1
g1分区域 每个区域是有老年代概念的 但是收集器以整个区域为单位收集
g1回收后马上合并空闲内存 cms 在stw的时候做
区别
XX:G1HeapRegionSize
复制成活对象到一个区域 暂停所有线程
内存区域设置
垃圾回收器
老年代写满
system。gc
持久代空间不足
full gc
STW
设置堆的最大最小值 -xms -xmx
防止年轻代堆收缩:老年代同理
-XX:newSize设置绝对大小
调整老年和年轻代的比例
主要看是否存在更多持久对象和临时对象
观察一段时间 看峰值老年代如何 不影响gc就加大年轻代
配置好的机器可以用 并发收集算法
每个线程默认会开启1M的堆栈 存放栈帧 调用参数 局部变量 太大了 500k够了
原则 就是减少gc stw
性能调优
jasvism
dump
监控配置 自动dump
FullGC 内存泄露排查
实战
oom种类
逃逸分析
虚拟机栈(栈帧中的本地变量表)中引用的对象方法区中类静态属性引用的对象方法区中常量变量引用的对象本地方法栈中JNI(即一般说的Native方法)引用的对象活跃线程的引用对象
可达性
OOM
线程死锁
锁争用
Java进程消耗CPU过高
JVM调优
Jconsole
Jprofiler
jvisualvm
MAT
JVM性能检测工具
help dump
生产机 dump
mat
jmap
-helpdump
topc -c
top -Hp pid
jstack
cat
CPU100%
JVM
Spring Cloud Netflix Eureka
Spring Cloud Netflix Ribbon
Spring Cloud OpenFeign
Spring Cloud Netflix Hystrix
Spring Cloud Gateway
Spring Cloud Config
SpringCloud
Nginx的简介
什么是正向代理、反向代理
Nginx的安装
Nginx配置虚拟主机
Nginx配置服务的反向代理
Nginx的负载均衡配置
Nginx
选举机制
过半机制
预提交 ack 2pc
ZAB协议?
zk节点宕机如何处理?
如何实现分布式一致性
架构
存储难点
存储选型
存储设计
分区和日志
安装
自定义分区
自动控制
生产消息的性能优化
存储消息的性能优化
消费消息的性能优化
高性能设计
如何保证消息不丢失
如何处理重复消息
保证消息有序性
如何处理堆积消息
Kafka
真实企业级项目
GitHub项目
其他项目
项目
JAVA 体系
收藏
0 条评论
回复 删除
下一页