架构师训练营第九周命题作业
作业一:
请简述 JVM 垃圾回收原理。
JVM 垃圾回收就是将 JVM 堆中的已经不再被使用的对象清理掉,释放宝贵的内存资源。
JVM 通过一种可达性分析算法进行垃圾对象的识别,具体过程是:
从线程栈帧中的局部变量,或者是方法区的静态变量出发,将这些变量引用的对象进行标记;
然后看这些被标记的对象是否引用了其他对象,继续进行标记;
所有被标记过的对象都是被使用的对象,而那些没有被标记的对象就是可回收的垃圾对象了。
进行完标记以后,JVM 就会对垃圾对象占用的内存进行回收,回收主要有三种方法:
清理:将垃圾对象占据的内存清理掉。其实 JVM 并不会真的将这些垃圾内存进行清理,而是将这些垃圾对象占用的内存空间标记为空闲,记录在一个空闲列表里,当应用程序需要创建新对象的时候,就从空闲列表中找一段空闲内存分配给这个新对象。
压缩:从堆空间的头部开始,将存活的对象拷贝放在一段连续的内存空间中,那么其余的空间就是连续的空闲空间。
复制:将堆空间分成两部分,只在其中一部分创建对象,当这个部分空间用完的时候,将标记过的可用对象复制到另一个空间中。
内存分为「新生代」和「老年代」,「新生代」又分位「Eden区」、「From区」和「To区」。老年代区域比新生代区域要大一些。
垃圾回收过程分为两种,Young GC(只对新生代的对象进行回收) 和 Full GC(对老年代和新生代的对象都进行回收)。具体过程是:
创建对象都在 Eden 区创建
Eden 区满了以后,开始执行垃圾回收(很多对象是在方法执行的栈帧中创建的临时对象,会被回收掉)
把仍然在用的对象拷贝到 From 区(此时 Eden 区变空了,可以继续创建对象)
再在 Eden 区创建新对象
Eden 区又满了,再次执行垃圾回收,把仍在用对象拷贝到到 From 区
多次拷贝后,From 区放不下,就把 Eden 区和 From 区的对象都拷贝到 To 区(这时 From 区变空了)
又在 Eden 区创建新对象
Eden 区满了以后,把 Eden 区和 To 区的对象,复制到 From 区(这时 Eden 区和 To 区空了)
如此多次执行拷贝的过程,对于仍然在用的对象,它们会被拷贝到老年代
过一段时间,老年代区域也满了,就对老年代中的对象执行垃圾回收(此时也会对新生代中的对象也执行一次垃圾回收)
作业二:
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
静态化
采用 JS 自动更新技术将动态页面转化为静态页面
后台把更新的 JS 文件推送到部署服务器
并发控制,防秒杀器
设置阀门,只放最前面的一部分人进入秒杀系统
简化流程
砍掉不重要的分支流程,如下单页面的所有数据库查询
以下单成功作为秒杀成功标志。支付流程只要在 1 天内完成即可。
前端优化
采用 YSLOW 原则提升页面响应速度
版权声明: 本文为 InfoQ 作者【一马行千里】的原创文章。
原文链接:【http://xie.infoq.cn/article/502e607edbf1f5e6ce2747b1d】。文章转载请联系作者。
评论