写点什么

架构师训练营第 9 周课后练习

用户头像
叶纪想
关注
发布于: 2020 年 11 月 22 日

题目



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

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

解答

1.JVM 垃圾回收就是把JVM 堆中不再使用的对象清理掉,释放内存资源。

不再使用的对象如何识别,目前 JVM 主流的垃圾回收器采用的是可达性分析算法进行。这个算法将一系列GC Roots作为初始的存活对象集合,从该集合出发,探索被该集合引用的对象,并将其加入到该集合中。最终,未被探索到的对象就是死亡对象,可以进行回收。

当标记完所有的存活对象,就可以进行死亡对象的回收工作了,回收的方式有三种。

第一种是清除,即把死亡对象占据的内存标记为空闲内存,并记录在空闲列表中。当需要创建新对象时,内存管理模块会从该空闲列表中分配内存给新对象。

第二种是压缩,即把存活的对象聚集到内存区域的起始位置,从而留下一段连续的内存空间。

第三种是复制,即把内存区域分为两等分,分别用两个指针form和to来维护,并且只用from指针指向的内存区域来分配内存。当发生垃圾回收时,便把存活的对象复制到to指针指向的内存区域,并且交换from指针和to指针的内容。

上述几种回收算法各有利弊,JVM 垃圾回收采用分代回收的方式实现,即将堆空间划分为两代,分别叫新生代和老年代。分代回收基于一个假设,大部分Java对象的存活时间都很短,存活下来的小部分 Java 对象则会存活很长一段时间。新生代存储新建的对象,当对象存活时间够长时,将其移动到老年代。不同代可以使用不同的回收算法。目前主流的垃圾回收实现有CMS,G1等。



2.主要的问题和挑战是高并发。高并发会占用大量的网络带宽,需要大量的机器处理后端请求。

架构思路是单独搭建秒杀服务集群,隔离对其他业务的影响。图片可以用CDN缓存,降低网络带宽压力。页面静态化,css,js,图片合并请求,降低到后台的请求。设置流量控制,只放一部分请求通过,其他请求直接返回秒杀结束。

用户头像

叶纪想

关注

还未添加个人签名 2018.05.23 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第 9 周课后练习