写点什么

JVM 垃圾回收原理及秒杀系统设计思路

用户头像
Acker飏
关注
发布于: 2020 年 08 月 05 日

JVM 垃圾回收原理

如何识别对象存亡

一般一个对象不再被引用,就代表该对象可以被回收。目前有以下两种算法可以判断该对象是否可以被回收。

引用计数算法:为每个对象添加一个引用计数器,统计指向该对象的引用个数。需要截获所有引用更新操作,并相应地增减目标对象的引用计数器。如果有一个引用被赋值为某一对象,那么将该对象的引用计数器 +1,如果一个原指向某个对象的引用,被赋值为其他值,那么将该对象的引用计数器 -1。一旦某个对象的引用计数器为 0 时,则说明该对象死亡,可以被回收。

可达性分析算法:GC Roots 是所有对象的根对象,在 JVM 加载时,会创建一些普通对象引用正常对象。这些对象作为正常对象的起始点,在垃圾回收时,会从这些 GC Roots 开始向下搜索,当一个对象到 GC Roots 没有任何引用链相连时,就证明此对象是不可用的。

垃圾回收算法

标记清除(mark-sweep):标记死亡对象所占据的内存为空闲内存,并记录在一个空闲列表(free list)

当需要新建对象时,内存管理模块从该空闲列表中寻找空闲内存,划分给新建的对象.

标记复制(mark-copy):内存两等分,分别用两个指针 from 和 to 来维护,并只用 from 指针指向的内存区分配内存。发生 GC 时,把存活对象复制到 to 指针 指向的内存区,并交换 from 指针和 to 指针。

标记压缩(mark-compact):把存活的对象 聚集到 内存起始位置,留下 连续的内存空间。

VM 的分代回收

根据对象存活周期不同,堆空间划分新生代和老年代,会根据他们的不同特点来区别对待,进行垃圾回收的时候会使用不同的垃圾回收方式,针对新生代的垃圾回收器有如下三个:Serial、Parallel Scavenge、Parallel New,他们采用的都是标记-复制的垃圾回收算法。

针对老年代的垃圾回收器有如下三个:Serial Old 、Parallel Old 、CMS,他们使用的都是标记-压缩的垃圾回收算法。


秒杀系统设计思路


秒杀系统的主要挑战与问题:

  1. 系统将面对大量请求,往往由于过载,整体处理能力下降,甚至瘫痪,导致所有用户都无法购买。

  2. 在大流量高并发情况下如何保证数据的一致性。

  3. 在不堆服务器的情况下何如应对是平时数百上千倍的并发访问。


核心的架构思路:

  1. 将请求尽量拦截在系统上游。避免将流量都压到后端数据层,会导致读写锁冲突严重,导致请求超时。

  2. 读多写少充分利用缓存。

  3. 使用异步处理的方式削峰应对。


浏览器或 APP:做限速

Web 层:做资源静态化

服务层:使用异步处理的方式,采用队列做排队系统。做数据缓存。

最后针对业务还要再做进一步优化


用户头像

Acker飏

关注

还未添加个人签名 2018.05.03 加入

还未添加个人简介

评论

发布
暂无评论
JVM 垃圾回收原理及秒杀系统设计思路