week9 作业
1,JVM 垃圾回收原理
JVM 垃圾回收(Garbage Collection,通常被称为“GC”)就是将JVM堆中已经不再使用的对象清理掉,释放宝贵的内存资源。
JVM中,程序计数器、Java栈、本地方法 都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了内存的自动清理。而方法区中存放从磁盘加载进来的类字节码,Java堆中存放的是程序运行过程中创建的类实例。因此,内存的垃圾回收主要集中于Java堆和方法区中,程序运行期间,这部分内存分配是动态的。
GC的过程可以表述为:
1 识别可回收的垃圾对象
当程序中创建对象的时候,即new 关键字创建一个对象,GC就开始监控对象的地址、大小及使用状态。通常使用可达性分析算法找到那些否需要回收的对象,即不在被任何途径使用的对象,具体过程是:从“GC Roots”的对象(线程栈帧中的局部变量、方法区中静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI(Native方法)引用的对象 )开始标记,然后看被标记的对象是否引用了其他对象,继续向下标记,所有被标记的对象都是被应用使用的对象,没有被标记的对象也就是没有被任何对象引用,就是可以回收的垃圾对象了。
2 回收垃圾对象占用的内存
2.1 清理
将垃圾对象占用的内存空间标记为空闲,记录在一个空闲列表中,当程序需要创建新对象的时候,从空闲列表中拿出一段空闲内存分配个新对象。
2. 2 压缩
从堆空间的head开始,将存货对象拷贝放在一段连续的内存中,剩下的空间就是连续的空闲空间。
2.3 复制
将堆空间分成部分,一部分空间创建对象,这部分空间用完时,将标记过的可用对象复制到另一个空间中。
2.4 分代收集
把java堆分为新生代和老年代,根据各个年代的特点采用最合适的回收算法。所有新生成的对象首先都是放在新生代的。新生代的目标就是尽可能快速地回收掉那些生命周期短的对象。老年代中存放经历了多次垃圾回收后仍然存活的对象,这些对象的生命周期较长。新生代默认的空间占比总空间的 1/3,老生代的默认占比是 2/3。新生代使用的是复制算法,新生代里有 3 个分区:Eden、To、From,它们的默认占比是 8:1:1,执行流程如下:把 Eden + From 存活的对象放入 To 区;清空 Eden 和 From 分区;From 和 To 分区交换,From 变 To,To 变 From。每次在 From 到 To 移动时都存活的对象,年龄就 +1,当年龄到达 15(默认配置是 15)时,升级为老生代。大对象也会直接进入老生代。老生代当空间占用到达某个值之后就会触发全局垃圾收回,一般使用标记整理的执行算法。以上步骤循环往复就构成了整个分代垃圾回收的整体执行流程。
2,设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
三道阀门的设计
阀门:基于 TT 的计数器
秒杀器的预防
秒杀商品详情页面
URL: 随机
秒杀前2秒放出,脚本生成,秒杀前。
1000次访问上限控制【每件商品只能放入1000人流量】。
下单页面:
订单ID,随机。
不能直接跳过秒杀 商品详情页面 进入。
每个秒杀商品,带预先生成的随机 Token 作 URL 参数。
如果秒杀过,直接跳到秒杀结束页面。
100 次访问上限控制 【每件商品只能放入 1000 人下单】。
XXX.com 秒杀系统:设计原则
静态化
采用 JS 自动更新技术将动态页面转化为静态页面。(为运营人员开发,上传秒杀商品信息,转换为静态页面的运营系统。)
并发控制,防秒杀器
设置阀门,只放最前面的一部分人进入秒杀系统。
简化流程
砍掉不重用的分支流程,如下单页面的所有数据库查询。
以下单成功作为秒杀成功标志。支付流程只要在 1 天内完成即可。
前端优化
采用 YSLOW 原则提升页面的响应速度。
评论