第九周总结
本周是性能优化的第三课,主要内容是数据库知识、JVM 知识以及 JAVA 编程优化技巧并且以如何设计一个秒杀为总结。
数据库知识
一条 SQL 语句执行过程是较为复杂的,客户端需要连接服务端、编译、优化、执行等步骤类似于 JVM 字节码的执行。简化版的执行过程如下:
预编译
防止 SQL 注入
提升执行效率
索引
聚簇索引
非聚簇索引
事务
原子性
一致性
隔离性
持久性
JVM 知识
Java 是一种跨平台的语言,JVM 屏蔽底层系统的不同,为 JAVA 字节码文件构造了一个统一的运行环境。
在程序运行过程中,JVM 将字节码解释执行,屏蔽堆底层操作系统的依赖;JVM 也可以将字节码编译执行,当 JVM 判断其是热点代码,会通过 JIT 机制动态地将其编译为机器码,提高执行效率。
类加载器
JVM 的类加载是用来将应用的字节码文件加载到内存中执行,为了防止 class 的重复加载,采用双亲委托加载模型,从上至下为 Bootstrap Classloader、Extension Classloader、Application Classloader;当然用户可以通过继承 ClassLoader 类来自定义类加载器。
JVM 运行时区域
Java 应用启动后会作为一个进程运行,在 JVM 启动的过程可以通过参数 -Xms
和 -Xmx
分别设置堆的最小和最大内存。通常来说,根据 JVM 内存区域的作用可以将其划分为:
堆
Java 线程栈
元数据区
程序计数器
JNI 线程栈
直接内存
JVM 垃圾回收
JVM 垃圾回收就是把 JVM 堆中已经不再被使用的对象清理掉,释放宝贵的内存资源。通常判断一个对象是否可以回收有引用计数法(淘汰)和可达性分析(GC Roots)两种。而对象回收算法有清理、压缩、复制。考虑到堆上对象的特征(朝生夕死)通常 GC 回收是执行分代回收机制,即 YoungGC 和 FullGC。
JVM 垃圾收集器
serial GC
parallel GC
CMS GC
G1 GC
ZGC
JAVA 优化技巧
合理使用多线程
防止内存泄漏
合理使用容器类
缩短对象生命周期
IO Buffer & NIO
组合代替继承
秒杀系统
秒杀是指有限的商品以一个集体的价格在一个确定的时间售卖。
主要挑战
瞬间高并发
秒杀器
核心架构方案?
基于系统的稳定性、秒杀活动的通用性和常态化,可以设计一套秒杀活动系统,其主要有秒杀商品列表、秒杀商品详情、下单支付三个页面组成。主要设计原则如下:
静态化
并发控制(基于计数器防止秒杀器)
简化流程
前端优化
版权声明: 本文为 InfoQ 作者【睁眼看世界】的原创文章。
原文链接:【http://xie.infoq.cn/article/4a3823faefa9f2af667ce11e1】。文章转载请联系作者。
评论