性能优化 -3
JVM 垃圾回收原理
请简述 JVM 垃圾回收原理
JVM 内存运行时数据区
堆(heap) : 他是最大的一块区域,用于存放对象实例和数组,全局线程共享。该区域动态分配内存,所以空间大小和生命周期都不是明确的,而 GC 的主要作用就是自动释放逻辑堆里实例对象所占的内存,而在逻辑堆中还分为新生代与老年代,用来区分对象的存活时间,在新生代中还被细致的分为 Eden SurvivorFrom 以及 SurvivorTo 这三部分.
栈(stack) : 全称为虚拟机栈,主要存储基本数据类型,以及对象的引用,私有线程。
方法区(Method Area) : 在 class 被加载后的一些信息 如常量,静态常量这些被放在这里,在 Hotspot 里面我们将它称之为永生代
垃圾回收算法
垃圾回收方式:
1.Minor GC
对新生代进行回收,不会影响到年老代。因为新生代的 Java 对象大多死亡频繁,所以 Minor GC 非常频繁,一般在这里使用速度快、效率高的算法,使垃圾回收能尽快完成。
2.Full GC
也叫 Major GC,对整个堆进行回收,包括新生代和老年代。由于 Full GC 需要对整个堆进行回收,所以比 Minor GC 要慢,因此应该尽可能减少 Full GC 的次数,导致 Full GC 的原因包括:老年代被写满、永久代(Perm)被写满和 System.gc()被显式调用等。
参考:https://zhuanlan.zhihu.com/p/54851319
秒杀系统
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
挑战和问题:
可访问性:短时间大流量造成网站不可用;与 DDOS 攻击相区分
弹性:非秒杀阶段,系统资源自动释放,节省成本;秒杀阶段,提前预备系统资源
锁:防止同 IP 多写,避免超过预定库存量
互斥:防止单一 ip 过多下订单,造成不公平
一致性:请求最终一致: 用户,商品,付款
核心架构方案:
部署方案:
秒杀入口排队服务器(请求缓存)+流程处理子服务器(库存信息缓存)+后方业务服务器(库存永久存储)
算法:
资源预分配:被秒杀的资源按子服务器的性能,提前设置给内部子服务器商品缓存。
秒杀时间段:
请求分类:按请求的资源动静属性分类,区分常规与秒杀请求;秒杀请求定位到专有服务器入口
排队:秒杀请求从外部服务器入口首先进入排队算法:双队列(已服务,未服务),包含属性用户 ID,请求 IP,入队时间,优先级(代金券,地域)等
分流:弹出排队队首:1,分配下一个'未服务'请求到内部子服务器进行后续流程---[商品选择]---[锁定库存] 或者 [锁定库存失败并退出(同时从已服务队列移除)] --- [付款 and 减少库存] 或者[超期付款,释放库存锁定并从已服务队列移除]。;2,标记用户 ID 进入'已服务'缓存队列
汇总:秒杀结束后,传递所有子服务器缓存进 ERP 业务服务器,校验以后进行后续拣货流程,或异常处理等。
资源释放:活动结束以后释放系统资源
评论