写点什么

性能优化 -3

用户头像
raox
关注
发布于: 2021 年 01 月 17 日
性能优化-3

JVM 垃圾回收原理

请简述 JVM 垃圾回收原理

JVM 内存运行时数据区

  • 堆(heap) : 他是最大的一块区域,用于存放对象实例和数组,全局线程共享。该区域动态分配内存,所以空间大小和生命周期都不是明确的,而 GC 的主要作用就是自动释放逻辑堆里实例对象所占的内存,而在逻辑堆中还分为新生代与老年代,用来区分对象的存活时间,在新生代中还被细致的分为 Eden SurvivorFrom 以及 SurvivorTo 这三部分.

  • 栈(stack) : 全称为虚拟机栈,主要存储基本数据类型,以及对象的引用,私有线程。

  • 方法区(Method Area) : 在 class 被加载后的一些信息 如常量,静态常量这些被放在这里,在 Hotspot 里面我们将它称之为永生代


图片引用自:https://www.jvmhost.com/articles/how-can-i-monitor-memory-usage-of-my-tomcat-jvm/jvm_memory_diagram1.png


垃圾回收算法

垃圾回收方式:

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 过多下订单,造成不公平

一致性:请求最终一致: 用户,商品,付款


核心架构方案:

部署方案:

秒杀入口排队服务器(请求缓存)+流程处理子服务器(库存信息缓存)+后方业务服务器(库存永久存储)


算法:

  1. 资源预分配:被秒杀的资源按子服务器的性能,提前设置给内部子服务器商品缓存。

  2. 秒杀时间段

  3. 请求分类:按请求的资源动静属性分类,区分常规与秒杀请求;秒杀请求定位到专有服务器入口

  4. 排队:秒杀请求从外部服务器入口首先进入排队算法:双队列(已服务,未服务),包含属性用户 ID,请求 IP,入队时间,优先级(代金券,地域)等

  5. 分流:弹出排队队首:1,分配下一个'未服务'请求到内部子服务器进行后续流程---[商品选择]---[锁定库存] 或者 [锁定库存失败并退出(同时从已服务队列移除)] --- [付款 and 减少库存] 或者[超期付款,释放库存锁定并从已服务队列移除]。;2,标记用户 ID 进入'已服务'缓存队列

  6. 汇总:秒杀结束后,传递所有子服务器缓存进 ERP 业务服务器,校验以后进行后续拣货流程,或异常处理等。

  7. 资源释放:活动结束以后释放系统资源


用户头像

raox

关注

还未添加个人签名 2019.02.11 加入

还未添加个人简介

评论

发布
暂无评论
性能优化-3