写点什么

第九周作业

用户头像
Griffenliu
关注
发布于: 2020 年 12 月 18 日



1.请简述 JVM 垃圾回收原理。

  • 基本原理

JVM通过一种可达性分析算法进行垃圾对象的识别,具体过程为:从线程栈帧中的局部变量或方法去的静态变量触发,将这些变量引用的对象进行标记,然后看这些对象是否引用了其他对象,继续进行标记,所有被标记过的对象都是使用中的对象,没有被标记的则是可回收的垃圾对象。

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

  • 清理: 清理垃圾对象占用的内存空间,并不是真正的清理空间,而是将这部分内存空间标记位空闲,记录在一个空闲列表离,当应用程序需要内存空间时,就可以将标记为空闲的空间分配给新对象。

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

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

  • JVM的分代垃圾回收策略

  • 新生代: 创建对象,回收对象。分为三个区域,Eden区,From区,To区,在Eden区创建对象,Eden区满了之后,执行一次垃圾回收,采用复制算法,将标记为可用的复制到From区。当Eden区再次满了,向From区复制时,如果发现From区也满了,则将Eden区和From区的对象都拷贝到To区,此时Eden和From区都被清空,可以继续使用,如果Eden区再次满了,则执行垃圾回收算法,将可用对象都复制到From区。如果多次拷贝后,某对象还是可用对象,说明其生命周期较长,则将该对象移动到老年代。

  • 老年代: 如果老年代也满了,则对老年代也执行垃圾回收。

  • 来及回收器算法

  • 串行回收器 - 单核时代,只有一个线程进行垃圾回收,会导致较长时间的stop the world.

  • 并行回收器 - 多核时代,启动多个线程进行垃圾回收,仍然会导致stop the world.

  • 并发回收器CMS - 把垃圾回收过程分为多个阶段,分为初始标记阶段,并发标记,重标记,并发清理等几个阶段,在初始标记阶段仍然会stop the world,并发标记时垃圾回收线程和用户线程并发执行,不对用户线程产生较大影响,重标记(防止新对象未被标记)阶段仍然会导致stop the world。清理阶段也是并发执行的。这种回收器stop the world时间较短,对用户影响较小。

  • G1回收器 - 新版JDK跟多使用G1回收器,G1回收器将内存拆分为多个小块,针对小块进行垃圾回收以加快回收速度。G1回收器会根据期望的stop the world时间动态调整。



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

  • 问题:

  • 并发高

  • 占用网络带宽

  • 后端服务器被压垮

  • 使用秒杀器,用机器代替人工自动刷新秒杀页面或跳过秒杀页面直接下单。



  • 架构方案或思路

  • 限制活动资源,例如图片等大小

  • 使用CDN减轻服务器压力

  • 提前预估好单件商品并发,做好硬件准备

  • 和应用服务器隔离,采用独立开发和部署的秒杀系统

  • 秒杀页面静态化,采用调度,消息触发等机制自动生成秒杀静态页面

  • 设置阀门,只放最前面的人进入秒杀系统,下单页,支付系统等

  • 简化支付流程,只要下单成功即可作为秒杀成功,支付可以在指定时间内完成即可

  • 防机器人,商品页面只有在秒杀开始时才可进入



用户头像

Griffenliu

关注

还未添加个人签名 2020.07.05 加入

还未添加个人简介

评论

发布
暂无评论
第九周作业