架构师训练营第九周作业
请简述 JVM 垃圾回收原理。
1)可达性分析算法。
从线程栈中的局部变量以及方法区的静态变量出发,将其引用的的对象标记,然后在继续标记这些已经标记的引用的对象,一次递归。标记过的对象是正在使用之中的对象。没被标记的可以被垃圾回收。
2)垃圾回收的方法
清理: 将垃圾对象占用的内存空间标记为空闲,记录在空闲列表里以复用。
压缩:存活的对象从堆的头部开始占用连续空间。
复制: 将堆空间分成两个部分,只在其中一部分创建对象,当这个部分空间用完的时候,记过的可用对象复制到另一个空间里。
3)JVM 垃圾回收算法
目前常见的并发回收器 CMS(ConcMarkSweepGC) 和 G1 回收器。
4)JVM 中堆的分区
如上图所示,堆分成了 Eden 区,survivor Space 区(用来来回拷贝),Tenured 区和永久区。
完整的 CMS 算法过程:
Minor GC: 定义:从 Eden 区和 Survivor 区进行垃圾回收。
当 Eden 区满了之后,直接使用复制的方法,将可用对象复制到 S0 区。S0 满了会复制到 S1 区,S0 和 S1 区会循环 15 次左右。所有策略都是 Mark and Copy。没有压缩。
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
问题和挑战:
1)瞬间的高并发。如何保证响应,以及不影响其他的核心业务。数据库的压力。
2) 秒杀开始之前,不能暴露填写订单的 URL。URL 要是随机生成的。
核心的架构方案:
1)动态资源静态化。大大减少服务器,数据库的压力。
2)限流。基于计数器,让少部分人进入秒杀页面,下单页面和支付系统。其他的直接返回秒杀结束,把大部分访问挡住。
3)秒杀开始前,服务器动态随机生成下单页面的 URL。每次用户刷新时,服务器判断该商品是否正在秒杀。如果该商品正在开始秒杀,会返回下单的 URL。
4) 简化流程。
5)域名分离,不影响原来的业务。
评论