架构师训练营 week9
请简述 JVM 垃圾回收原理。
Java堆是JVM主要的内存管理区域,里面存放着大量的对象实例和数组。在垃圾回收算法和垃圾收集器之前,首先要做的就是判断哪些对象已经“死去”,需要进行回收即不可能再被任何途径使用的对象。
1、引用计数法
引用计数法是这样:给对象中添加一个引用计数器,每当有一个地方使用它时,计数器值就加1。当引用失效时,计数器就减1。任何时刻计数器为0的对象就是不可能再被使用的。
![](https://static001.geekbang.org/infoq/1c/1c91169ff735b21daa16d650700d3dcb.png)
现在主流的Java虚拟机都没有使用引用计数法,最主要的原因就是它很难解决对象之间互相循环引用的问题。
2、可达性分析
可达性分析的基本思路:通过一系列称为"GC Roots"的对象作为起点,从这些节点开始向下搜索,如果从GC Roots到一个对象不可达,则证明此对象是不可用的,如下图所示。
![](https://static001.geekbang.org/infoq/d7/d767510189b1531f2fe835b8f589e824.jpeg?x-oss-process=image/resize,p_80/auto-orient,1)
![](https://static001.geekbang.org/infoq/92/92b436a2f1d92b1ff385ac99927ab573.png)
Java语言中,可作为GC Roots的对象包括下面几种:
虚拟机栈(栈帧中的本地变量表)中引用的对象
本地方法栈JNI(即一般说的Native方法)引用的对象
方法区中类静态常量引用的对象
方法区中常量引用的对象
对于Java程序而言,对象基本都位于堆内存中,简单来说GC Roots就是有被堆外区域引用的对象。
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
1.挑战和问题
秒杀系统需要面对的技术挑战如下:
对现有网站业务造成冲击
高并发下的应用、数据库负载
突然增加的网络及服务器带宽
直接下单:对秒杀URL的控制,避免秒杀前被刷。
秒杀系统的核心问题:
并发读: 核心优化理念是尽量减少用户到服务端来“读”数据,或者让他们读更少的数据。
并发写: 要求我们在数据库层面独立出来一个库,做特殊的处理。
我们还要针对秒杀系统做一些保护,针对意料之外的情况设计兜底方案,以防止最坏的情况发生。
其他需要处理的问题:
如何控制秒杀商品页面购买按钮的点亮
如果只允许第一个提交的订单被发送到订单子系统
2.架构方案
秒杀系统的应对策略主要有以下几点:
秒杀系统独立部署
秒杀商品页面静态化,动静分离
租借秒杀活动网络带宽
动态生成随机下单页面URL
热点数据隔离:处理热点数据通常有几种思路:一是优化,二是限制,三是隔离。
评论