写点什么

极客大学架构师训练营 JVM 虚拟机原理 Java 编程优化 秒杀 第九次作业

用户头像
John(易筋)
关注
发布于: 2020 年 08 月 05 日

请简述 JVM 垃圾回收原理。

JVM 的垃圾回收


JVM 垃圾回收即使将 JVM 堆中的已经不再被使用的对象清理掉,释放宝贵的内存资源。


JVM 通过一种可达性分析算法进行垃圾对象的标识。具体过程是:

  1. 从线程栈帧中的局部变量,或者方法区的静态变量出发,将这个变量引用的对象进行标记;

  2. 然后看这些被标记的对象是否引用了其它对象,继续进行标记;

  3. 所有被标记过的对象都是被使用的对象,而那些没有被标记的对象就是可回收的垃圾对象了。


进行完标记以后,JVM 就会对垃圾对象占用的内存进行回收,回收主要有三种方法:

  1. 清理:将垃圾对象占据的内存清理掉,其实 JVM 并不会真的将这些垃圾内存进行清理,而是将这些垃圾对象占用的内存空间标记为空闲,记录在一个空闲的列表里,当应用程序需要创建新的对象的时候,就从空闲列表中找一段空闲内存分配给这个对象。

  2. 压缩:从堆空间的头部开始,将存活的对象拷贝到一段连续的内存空间中,那么其余的空间就是连续的空闲空间。

  3. 复制:将堆空间分成两部分,只在其中一部分创建对象,当这个部分空间用完的时候,将标记过的可用对象复制到另一个空间中。

清理:把已经没用的空间标记为可用空间。

压缩:清理有个短板,空间不是连续的,压缩就是把还在用的 copy 放在前面。

复制:压缩还是需要成本的,速度较慢;分两块区域会更好一点。


JVM 分代垃圾回收

  1. 创建新对象在 Eden 区,当 Eden 区满了以后,就会进行 Young GC,把在用的对象 copy 到 From 区;

  2. 当 Eden 区再次满了以后,再次进行 YoungGC,把 Eden 区和 From 区的在用对象,copy 到 To 区;

  3. 当多次 Eden 发送 YoungGC,把一些还用的对象放到老年代;

  4. 当老年代满了以后,就会进行 Full GC。这是要应用线程都要暂停,进行 Full GC。


JVM 垃圾回收器算法

  1. 串行回收器:当 JVM 空间满了以后,stop-the-world 停止所有应用程序的线程,进行垃圾回收。(以前的都是单 CPU)

  2. 并行回收器:多 CPU 时代,当 JVM 空间满了以后,stop-the-world 多线程进行垃圾回收。(大数据用这种方式,效率比较高)

  3. 并发回收器 CMS:初始化标记静态变量等以及引用的对象 > 并发标记 > 重标记(永远表不完对象,因为对象一直在创建。所以这个阶段也会 stop-the-world) > 并发清理。(早期 Web 应用都是用这种方式,但是浪费计算资源比较多。)

  4. G1 回收器(主流):效率更高,下面详细介绍。每次 stop-the-world 的时候,只会清理一部分区域,控制范围更小一些。


G1 垃圾回收内存管理机制

把大的内存分为 2000 个小块。

配置参数: -XX:MaxGCPauseMillis


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

三道阀门的设计

阀门:基于 TT 的计数器


秒杀器的预防

秒杀 商品详情页面

  • URL: 随机

  • 秒杀前 2 秒放出,脚本生成,秒杀前。

  • 1000 次访问上限控制【每件商品只能放入 1000 人流量】。


SetEnvIfNoCase Referer "^http://1688\.com/" local_ref=1<FilesMatch "\.(htm|html)">	Order Allow, Deny	Allow from env=local_ref</FilesMatch>
复制代码


下单页面:

  • 订单 ID,随机。

  • 不能直接跳过秒杀 商品详情页面 进入。

  • 每个秒杀商品,带预先生成的随机 Token 作 URL 参数。

  • 如果秒杀过,直接跳到秒杀结束页面。

  • 100 次访问上限控制 【每件商品只能放入 1000 人下单】。

XXX.com 秒杀系统:设计原则

静态化

  • 采用 JS 自动更新技术将动态页面转化为静态页面。(为运营人员开发,上传秒杀商品信息,转换为静态页面的运营系统。)


并发控制,防秒杀器

  • 设置阀门,只放最前面的一部分人进入秒杀系统。


简化流程

  • 砍掉不重用的分支流程,如下单页面的所有数据库查询。

  • 以下单成功作为秒杀成功标志。支付流程只要在 1 天内完成即可。


前端优化

  • 采用 YSLOW 原则提升页面的响应速度。


XXX 秒杀系统:静态化(1)

秒杀商品 List 和 Detail 是静态的 HTML 页面


秒杀系统:静态化(2)

秒杀商品列表, 秒杀商品介绍页面,如何判断秒杀开始否。

  • 答案: valid-offer.js var valid_offerIds = 23624364, 53778658, 35885833, 46999696, 5006797057.


每次只更新valid-offer.js, 这个 js 返回,哪些商品可以秒杀。同时返回秒杀商品的 url。


发布于: 2020 年 08 月 05 日阅读数: 69
用户头像

John(易筋)

关注

问渠那得清如许?为有源头活水来 2018.07.17 加入

工作10+年,架构师,曾经阿里巴巴资深无线开发,汇丰银行架构师/专家。擅长架构、算法、数据结构、设计模式、iOS、Java Spring Boot。易筋为阿里巴巴花名。

评论

发布
暂无评论
极客大学架构师训练营 JVM虚拟机原理 Java编程优化 秒杀 第九次作业