写点什么

架构师训练营 - week09 - 学习总结

用户头像
lucian
关注
发布于: 2020 年 11 月 22 日
本周重点学习了以下几个方面的内容:
  1. 数据库的基本原理

  2. JVM 组成结构和基本原理

  3. JVM 垃圾回收的基本原理和不同方案的分析

  4. JAVA 代码优化技巧和原理

  5. 秒杀系统案例剖析


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的作业。


用户头像

lucian

关注

还未添加个人签名 2018.03.13 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 - week09 - 学习总结