架构师培训 -08 总结 JVM、秒杀
1.JVM
JAVA 是这一种跨平台的语言,一处编译处处运行。JVM 屏蔽了底层系统的不同,为 JAVA 字节码文件构造了一个统一运行的环境。
1.1 组成架构
class 文件通过类加载器加载到方法区,同时将静态变量和静态方法进行初始化。将 class 创建(new)称对象时,对象存储在堆内存中,对象引用存储在栈中。程序技术寄存器用来记录当前栈执行到什么位置。
1.2 双亲委派机制
低层的类加载器,不能覆盖更高层次类加载器已经加载过的类。如果低层次类加载器要加载一个类,需要上级类加载器确认,只有上级类加载器未加载过这个类,也允许加载的时候,才能让当前类加载器加载这个类。
双亲委派机制作用:主要处于安全性考虑,防止核心类库的类被改写。
如何打破双亲委派机制?
自定义类加载器重写了 loadClass 和 findClass。
tomcat 利用这点解决了同时运行多个应用的相同类不同版本的问题。
1.3 线程工作内存 &votatile
synchronized 关键字除了保证可见性外,还保证了原子性。
1.4 垃圾回收
找垃圾
引用计算算法(循环引用的对象无法回收)和可达性算法(GC roots),所以基本上只用可达性算法。
清理垃圾算法
标记-清除、复制、标记-整理
清理垃圾算法的实现(垃圾回收器)
串行回收器,并行回收器,并发回收器 cms 和 G1 回收器,这些回收器在垃圾回收过程中都会有 STW。(还有 ZGC 等新垃圾回收器)
分代垃圾回收
整体分为年轻代和老年代。年轻代又分为 end 和两个 S 区,年轻代的特点是对象存活时间短;老年代存放年轻代在经过多次回收后还不能回收的对象。
2.秒杀
秒杀系统主要挑战:瞬间高并发
主要问题:绕过秒杀页面直接进入下单页面
主要解决思路
1.独立部署:将秒杀系统进行独立部署,可以使秒杀系统做些简化处理,同时也减少对其他业务系统的影响。
2.静态化:对于用户非个性化的数据可以由前端请求的数据改成静态在页面上,减少与后端的请求。
3.限流:只让一部分请求进入到后端处理,其他的直接尽早返回“秒杀已结束”之类的提示信息,从而减少后端并发读写的压力。
4.服务降级:可以将一些非重要功能服务进行降级处理,减少服务端的请求量。
如何控制绕过秒杀页面直接到下单页面提前下单?
在秒杀页面中引入一个 js 文件,js 文件中加入是否开始秒杀信息和下单页面 URL 的随机参数。在秒杀开始的时候生存一个新的 JS 文件,这个 JS 文件通过使用随机版本号的方式防止浏览器、CDN 等缓存。
评论