架构师训练营第 9 周学习总结
数据库架构原理
数据库架构
连接器
通常需要几百毫秒来创建连接,程序启动时一般会预先创建连接池
语法分析器
解析 SQL 语句构建抽象语法树
语义分析与优化器
对复杂嵌套的 SQL 进行语义等价转化,利用索引进一步进行优化
执行引擎
MySQL 可以通过 explain 来查看使用的索引和处理行数
PrepareStatement 优势
提前生成执行计划,效率会更高
防止 SQL 注入攻击
索引
聚簇索引
主键 ID 和记录行存储在同一个 B+树中
非聚簇索引
B+树叶子节点存储的是主键,需要回表取得其他字段
合理使用索引
添加索引操作耗时较长(分钟级别),并且会阻塞 CRUD 操作
删除不用的索引,避免不必要的增删开销
使用更小的数据类型创建索引
事务日志
在修改聚簇索引上的记录前,先写事务日志
UNDO 日志:更新前的数据
REDO 日志:更新后的数据
JVM 虚拟机原理
JVM 组成构架
类加载器
运行期数据区
执行引擎
字节码文件
热点代码会被 JIT 编译成机器码
其他代码会解释执行
类加载器
低层次的类加载器不能覆盖高层次类加载器已经加载的类
隔离加载类
扩展加载源
字节码加密
线程工作内存
线程操作内存变量时,需要通过线程独有的工作内存拷贝主内存变量副本来进行
多线程运行多 CPU 核心时,可能存在并发访问问题,使用 volatile 修饰
JVM 垃圾回收
回收方法
清理
压缩
复制
分代垃圾回收
新生代:Eden 区 / From 区 / To 区
老年代
JVM 垃圾回收器算法
串行回收器
并行回收器
并发回收器 CMS
G1 回收器
JVM 性能诊断工具
JPS
查看所有 Java 进程的 jvmid
JSTAT
实时监控资源和性能,包括 heap size 和垃圾回收情况
JMAP
输出所有内存对象
JSTACK
查看线程堆栈信息
JConsole
JVisualVM
Java 代码优化
多线程
最佳线程数
[ 任务执行时间 / (任务执行时间 - IO 等待时间) ] * CPU 内核数
线程安全代码
方法局部变量:线程安全
方法局部的对象引用:如果其他线程无法使用,线程安全
对象成员变量 :堆中对象不是线程安全的
ThreadLocal
内存泄露
长生命周期对象
静态容器
缓存
使用线程池和对象池
使用合适的 JDK 容器类
缩短对象生命周期
使用 IO buffer 及 NIO
优先使用组合代替继承
合理使用单例模式
案例 - 秒杀
隔离秒杀系统
CDN 图片访问
页面静态化
基于 TT 的计数器阀门
评论