第九周作业
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时间动态调整。
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
问题:
并发高
占用网络带宽
后端服务器被压垮
使用秒杀器,用机器代替人工自动刷新秒杀页面或跳过秒杀页面直接下单。
架构方案或思路
限制活动资源,例如图片等大小
使用CDN减轻服务器压力
提前预估好单件商品并发,做好硬件准备
和应用服务器隔离,采用独立开发和部署的秒杀系统
秒杀页面静态化,采用调度,消息触发等机制自动生成秒杀静态页面
设置阀门,只放最前面的人进入秒杀系统,下单页,支付系统等
简化支付流程,只要下单成功即可作为秒杀成功,支付可以在指定时间内完成即可
防机器人,商品页面只有在秒杀开始时才可进入
评论