写点什么

架构师训练营第九周命题作业

发布于: 2020 年 11 月 22 日

作业一:

请简述 JVM 垃圾回收原理。



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



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

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

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

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



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

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

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

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



内存分为「新生代」和「老年代」,「新生代」又分位「Eden区」、「From区」和「To区」。老年代区域比新生代区域要大一些。



垃圾回收过程分为两种,Young GC(只对新生代的对象进行回收) 和 Full GC(对老年代和新生代的对象都进行回收)。具体过程是:

  1. 创建对象都在 Eden 区创建

  2. Eden 区满了以后,开始执行垃圾回收(很多对象是在方法执行的栈帧中创建的临时对象,会被回收掉)

  3. 把仍然在用的对象拷贝到 From 区(此时 Eden 区变空了,可以继续创建对象)

  4. 再在 Eden 区创建新对象

  5. Eden 区又满了,再次执行垃圾回收,把仍在用对象拷贝到到 From 区

  6. 多次拷贝后,From 区放不下,就把 Eden 区和 From 区的对象都拷贝到 To 区(这时 From 区变空了)

  7. 又在 Eden 区创建新对象

  8. Eden 区满了以后,把 Eden 区和 To 区的对象,复制到 From 区(这时 Eden 区和 To 区空了)

  9. 如此多次执行拷贝的过程,对于仍然在用的对象,它们会被拷贝到老年代

  10. 过一段时间,老年代区域也满了,就对老年代中的对象执行垃圾回收(此时也会对新生代中的对象也执行一次垃圾回收)





作业二:

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



静态化

  • 采用 JS 自动更新技术将动态页面转化为静态页面

  • 后台把更新的 JS 文件推送到部署服务器



并发控制,防秒杀器

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



简化流程

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

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



前端优化

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



发布于: 2020 年 11 月 22 日阅读数: 22
用户头像

还未添加个人签名 2018.07.26 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第九周命题作业