架构师训练营 - week09 - 学习总结
本周重点学习了以下几个方面的内容:
数据库的基本原理
JVM 组成结构和基本原理
JVM 垃圾回收的基本原理和不同方案的分析
JAVA 代码优化技巧和原理
秒杀系统案例剖析
1. 数据库的基本原理
数据库基础架构组成:
聚簇索引:聚簇索引的数据库记录和索引存储在一起。
MySQL 数据库的主键就是聚簇索引,主键 ID 和所在的记录行存储在一个 B+树中。
非聚簇索引:在叶子节点记录的就不是数据行记录,而是聚簇索引,也就是主键。
通过非聚簇索引找到主键索引,再通过主键索引找到行记录的过程也被称作回表。
添加必要的索引优化 SQL 查询性能,但是也要合理使用索引。
不要盲目添加索引
删除不用的索引,避免不必要的增删开销
使用更小的数据类型创建索引
2. JVM 组成结构和基本原理
Java 字节码文件:Java 如何实现在不同操作系统、不同硬件平台上 , 都可以不用修改代码就能顺畅地执
行?
计算机领域的任何问题都可以通过增加个中间层(虚拟层)来解决
Java 所有的指令有 200 个左右,一个字节( 8 位)可以存 储 256 种不同的指令信息,一
个这样的字节称为字节码( Bytecode )。在代码的执行过程中, JVM 将字节码解释执行,
屏蔽对底层操作系统的依赖, JVM 也可以将字节码编译执行,如果是热点代码,会通过
JIT 动态地编译为机器码,提高执行效率。
字节码执行流程:
Java 字节码文件编译过程:
类加载器的双亲委托模型:
低层次的当前类加载器,不能覆盖更高层次类加载器已经加载的类。如果低层次的类加载器想加载一个未知类,需要上级类加载器确认,只有当上级类加载器没有加载过这个类,也允许加载的时候,才让当前类加载器加载这个未知类。
线程工作内存 & volatile:
Java 内存模型规定在多线程情况下,线程操作主内存变量,需要通过线程独有的工作内存拷贝主内存变量副本来进行。
一个共享变量(类的成员变量、类的静态成员变量)被 volatile 修饰之后,保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
Java 运行环境:
3. JVM 垃圾回收的基本原理和不同方案的分析
具体笔记请见week09的作业。
4. JAVA 代码优化技巧和原理
合理并谨慎使用多线程
启动线程数 = [任务执行时间 / (任务执行时间 - IO 等待时间)] * CPU 内核数
最佳启动线程数和 CPU 内核数量成正比,和 IO 阻塞时间成反比。如果任务都是 CPU 计算型任务,那么线程数最多不超过 CPU 内核数,因为启动再多线程,CPU 也来不及调 度;相反如果是任务需要等待磁盘操作,网络响应,那么多启动线程有助于提高任务并 发度,提高系统吞吐能力,改善系统性能。
Java 线程安全
允许被多个线程安全执行的代码称作线程安全的代码。
方法局部变量
局部变量存储在线程自己的栈中。也就是说,局部变量永远也不会被多个线程共享。所以,基础类型的局部变量是线程安全的。
方法局部的对象引用
如果在某个方法中创建的对象不会逃逸出该方法,那么它就是线程安全的。
对象成员变量
对象成员存储在堆上。如果两个线程同时更新同一个对象的同一个成员,那这个代码就不是线程安全的。
ThreadLocal:
创建一个 ThreadLocal 变量(X 类静态成员变量):
public static ThreadLocal myThreadLocal = new ThreadLocal();
存储此对象的值(A 类 a 方法):
X.myThreadLocal.set("A thread local value");
读取一个 ThreadLocal 对象的值(B 类 b 方法):
String threadLocalValue = (String)X.myThreadLocal.get();
合理使用线程池和对象池
复用线程或对象资源,避免在程序的生命期中创建和删除大量对象
池管理算法(记录哪些对象是空闲的,哪些对象正在使用)
对象内容清除(ThreadLocal 的清空)
使用合适的 JDK 容器类(顺序表,链表,Hash)
LinkedList 和 ArrayList 的区别及适用场景
HashMap 的算法实现及应用场景
使用 concurrent 包,ConcurrentHashMap 和 HashMap 的线程安全特性有什么不同?
使用 I/O buffer 及 NIO
延迟写与提前读策略
异步无阻塞 IO 通信
优先使用组合代替继承
减少对象耦合
避免太深的继承层次带来的对象创建性能损失
合理使用单例模式
无状态对象
线程安全
计算机的任何问题都可以通过虚拟层(或者中间层)解决
面向接口编程
7 层网络协议
JVM
编程框架
一致性 hash 算法的虚拟化实现
5. 秒杀系统案例剖析
具体笔记请见week09的作业。
评论