写点什么

架构师训练营第九周:性能优化(三)

用户头像
看山
关注
发布于: 2020 年 11 月 22 日
架构师训练营第九周:性能优化(三)

请简述 JVM 垃圾回收原理


垃圾收集需要完成的三件事:


  • WHAT: 哪些内存需要回收?

  • WHEN: 什么时候回收?

  • HOW: 如何回收?


程序计数器、虚拟机栈、本地方法栈 3 个区域随线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出执行出栈和入栈的操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性,当方法结束或者线程结束时,内存自然随着回收了。


Java 堆和方法区这两个区域存在很多不确定性:一个接口的多个实现类需要的内存可能不一样,一个方法所执行的不同条件分支所需要的内存也可能不一样,只有处于运行期间,才能知道程序究竟会创建哪些对象,创建多少对象,这部分内存的分配和回收是动态的。


通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走的路径称为“引用链”(Reference Chain),如果某个对象到 GC Roots 间没有任何引用链相连,或者用图论的话是从 GC Roots 到这个对象不可达时,证明对象是不可能再被使用的。


在 Java 技术体系里面,固定可作为 GC Roots 的对象包括以下几种:


  • 在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。

  • 在方法区中类静态属性引用的对象,譬如 Java 类的引用类型静态变量。

  • 在方法区中常量引用的对象,譬如字符串常量池(String Table)里的引用。

  • 在本地方法栈中 JNI(即通常所说的 Native 方法)引用的对象。

  • Java 虚拟机内部的引用,如基本数据类型对应的 Class 对象、一些常驻的异常对象(比如 NullPointException、OutOfMemoryError)等、系统类加载器。

  • 所有被同步锁(synchronized 关键字)持有的对象。

  • 反应 Java 虚拟机内部情况的 JMXBean、JVMIT 中注册的回调、本地代码缓存等。


>可作为 GC Roots 的节点主要在全局性的引用(常量、类静态属性等)与执行上下文(栈帧中的本地变量表等)中。


设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?


秒杀系统相较于其他 C 端电商产品的主要挑战是高并发:并发读、并发写。


针对这个挑战,需要秒杀系统架构上保证三个方面:


  • 高性能:秒杀涉及大量的并发读和并发写,所以需要动静分离、热点的发现与隔离、请求的削峰与分层过滤、服务端优化等方面。

- 动静分离就是尽量将系统需要的数据分为动态数据和静态数据,静态数据可以使用 CDN 等缓存技术前置,减少网络请求延迟问题。然后提升网络访问效率,可以对合并请求,比如:合并图片、js、css 等,或者将 js、css 与 html 内容合并。

- 热点包括热点操作和热点数据。热点操作包括页面刷新(用户会在快到秒杀时间的时候大量刷新页面,想及早获取秒杀入口。)、下单(进入秒杀入口的用户会快速提交订单)等。热点数据主要是商品数据,包括商品基本信息、商品价格、商品库存等,商品基本信息和商品价格可以认为是静态热点数据,因为这些数据基本上不会变;商品库存属于动态数据,因为随着秒杀活动进行,库存数据会随之修改。静态热点数据可以采用 CDN 等前置缓存技术解决,动态静态数据则可以使用缓存数据库等优化方案。

- 请求削峰是将高并发的请求拉平,放入请求队列中,先进先出。就像蓄势的水库,开几个泄洪口就行。

- 分层过滤就是利用缓存技术将请求逐级过滤,比如浏览器缓存、CDN、WEB 服务器缓存等,应用服务中也可以使用多级缓存保障读请求的快速响应。这里还需要考虑网络限流,

- 服务端优化是这涉及应用服务的优化,最优先优化的应该是服务容器、服务器、内核、连接池等内容。

  • 一致性:这个主要是针对商品库存,因为秒杀系统一般是严格控制库存的,不能超卖。而且秒杀的场景中,一般是买到即赚到,所以下单成功不支付的情况非常少,所以秒杀场景一般采用下单减库存的方案。

  • 高可用:保障系统稳定可用,简单的方案就是错误直接返回秒杀结束,复杂一些就是做好请求降级熔断。还要设计一整套的 Plan B 方案。


发布于: 2020 年 11 月 22 日阅读数: 19
用户头像

看山

关注

公众号:看山的小屋 2017.10.26 加入

游于码界,戏享人生。

评论

发布
暂无评论
架构师训练营第九周:性能优化(三)