架构师训练营第九周总结
数据库优化
Why Using PreparedStatement
效率:预编译,预先生成语法树和执行计划,所以执行效率更高
安全:由于预先生成了执行计划,可以有效防止SQL注入
数据库存储
数据库索引的存储结构为B+树,分为聚簇索引和非聚簇索引
聚簇索引:数据库记录在叶子节点上的B+树
非局促索引:数据库记录不在叶子节点上的B+树,叶子节点上为聚簇索引的地址或记录的主键
在非聚簇索引上找到记录的主键值,再去聚簇索引上根据主键找到对应对的记录,叫回表。
数据库事务
通过UNDO和REDO日志实现数据库的原子性
JVM
内存模型
堆、栈、程序计数器、方法区
垃圾回收
垃圾标记算法:可达性分析
垃圾清理算法:清理、复制、压缩
垃圾回收器
串行回收器:只用一条线程执行垃圾收集工作,它在收集的同时,所有的用户线程必须暂停
并行回收器:串行回收器的多线程版本
CMS:高并发、低停顿,追求最短GC回收停顿时间,cpu占用比较高,响应时间快,停顿时间短,多核cpu 追求高响应时间的选择
G1:G1通过在垃圾回收领域应用并行化的策略,把几块大内存块的回收问题,变成了几百块小内存的回收问题,使得回收算法可以高度并行化
启动参数
标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
非标准参数(-X),指的是JVM底层的一些配置参数,这些参数在一般开发中默认即可,不需要任何配置。
非Stable参数(-XX),这类参数在jvm中是不稳定的,不适合日常使用的,后续也是可能会在没有通知的情况下就直接取消了,需要慎重使用。
-Xms:设置jvm内存的初始大小
-Xmx:设置jvm内存的最大值
-Xmn:设置新域的大小(这个似乎只对 jdk1.4来说是有效的,后来就废弃了)
-Xss:设置每个线程的堆栈大小(也就是说,在相同物理内存下,减小这个值能生成更多的线程)
-XX:NewRatio :设置新域与旧域之比,如-XX:NewRatio = 4就表示新域与旧域之比为1:4
-XX:NewSize:设置新域的初始值
-XX:MaxNewSize :设置新域的最大值
-XX:MaxPermSize:设置永久域的最大值
-XX:SurvivorRatio=n:设置新域中Eden区与两个Survivor区的比值。(Eden区主要是用来存放新生的对象,而两个Survivor区则用来存放每次垃圾回收后存活下来的对象)
诊断工具
基本工具:jps、jstat、jmap、jstack
集成工具:jconsole、jvisualvm
代码优化
多线程
启动线程数=(任务执行时间/(任务执行时间-IO阻塞时间))*CPU内核数
池化
对象池、连接池、线程池
池管理算法
缩短对象生命周期
使用NIO
优先使用组合代替继承
合理使用单例
秒杀系统设计
秒杀系统需要独立设计和部署避免影响原有系统的正常运行
页面优化和静态化
将动态页面静态化
图片压缩(雪碧图)、CSS、JS压缩
避免发送Cookies
并发控制
三个环节:进入秒杀页面→填写订单→提交订单,通过阀门将每一个环节只放一部分请求进入秒杀系统
流程简化
砍掉不需要的分支流程,尽量减少数据库的直接访问
秒杀器预防
详情页的URL随机生成,确保用户不能提前进入详情页
系统优化
反向代理参数优化、JVM参数优化、中间件和基础组件采用性能更高的版本
评论