week09 作业
请简述 JVM 垃圾回收原理。
jvm 垃圾回收是对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,释放垃圾占用的空间,防止内存泄露。
那么垃圾回收之前需要判断对象已经死亡或者失效,那么可以用可达性分析算法来实现。通过GC ROOT
的对象作为搜索起始点,通过引用向下搜索,所走过的路径称为引用链。通过对象是否有到达引用链的路径来判断对象是否可被回收。
知道了哪些对象需要被回收,那么对于回收的策略,有以下几种算法:
标记-清楚算法
复制算法
标记-整理算法
分代收集算法
目前主流的垃圾回收算法是分代收集算法。分代收集算法分代收集算法严格来说并不是一种思想或理论,而是融合上述 3 种基础的算法思想,而产生的针对不同情况所采用不同算法的一套组合拳,根据对象存活周期的不同将内存划分为几块。
在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。
在老年代中,因为对象存活率高、没有额外空间对它进行分配担保,就必须使用标记-清理算法或者标记-整理算法来进行回收。
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
关注点:
1、库存扣减,如何防止超卖或者少卖
2、流量控制,如何预防短时间内的高流量涌进
3、分布式事务
4、数据库压力
5、如何防刷
设计思路:
1、保证高并发,可以采用消息队列异步的方式,削峰填谷
2、库存的扣减对数据库压力较大,可以提前把库存放入缓存当中,或者把库存当做令牌方法,抢到令牌的请求,才能进行后续的下单操作
3、由于下单、支付、扣减库存、发货等一系列操作,要保证高可用,必须是分布式的分区容错的,此时会有分布式事务的存在,可以通过最终一致性来解决。
4、对于盗刷的话,需要做一下限流和限频,单个 ip 或者 mac 地址只能最多抢到一个库存。也可以根据用户基本信息和历史交易情况做风控。
评论