第九周作业
请简述 JVM 垃圾回收原理。
JVM 垃圾回收就是将 JVM 堆中的已经不再被使用的对象清理掉,释放宝贵的内存资源。
JVM 通过一种可达性分析算法进行垃圾对象的识别,具体过程是:从线程栈帧中的局部
变量,或者是方法区的静态变量出发,将这些变量引用的对象进行标记,然后看这些被
标记的对象是否引用了其他对象,继续进行标记,所有被标记过的对象都是被使用的对
象,而那些没有被标记的对象就是可回收的垃圾对象了。
进行完标记以后,JVM 就会对垃圾对象占用的内存进行回收,回收主要有三种方法
清理:将垃圾对象占据的内存清理掉,其实 JVM 并不会真的将这些垃圾内存进行清理,而
是将这些垃圾对象占用的内存空间标记为空闲,记录在一个空闲列表里,当应用程序需要创
建新对象的时候,就从空闲列表中找一段空闲内存分配给这个新对象。
压缩:从堆空间的头部开始,将存活的对象拷贝放在一段连续的内存空间中,那么其余的空
间就是连续的空闲空间。
复制:将堆空间分成两部分,只在其中一部分创建对象,当这个部分空间用完的时候,将标
记过的可用对象复制到另一个空间中。
JVM 分代垃圾回收策略
对新生代垃圾回收
对老年代垃圾回收
程序中大部分对象都是在新生代的 Eden 区域中,当 GC 来临时,会遵循如下机制:
1.当 Eden 区域触发 GC 的时候,将 Eden 中还存活的对象复制到 S0 中,再清空 Eden 区。
2.然后当 S0 触发 GC 时候,将 S0 和 Eden 中还存活的对象复制到 S1 中,再清空 S0 和 Eden 区。
3.当 S1 也触发 GC 的时候,就将此区域内的从 S0 复制过来并且 GC 后还存活的对象复制到老年代,再清空 S1。
值得注意的是:GC 发生的时机是根据剩余内存的大小和具体的算法来决定的,不一定是当内存存满了才触发一次 GC。并且这里的 GC 指的是 Minor GC,也就是用一些快速回收算法实现的高效率 GC,这种方式只会对新生代进行回收。
JVM 分代垃圾回收两个过程
Young GC,对新生代垃圾回收
Full GC 全量的垃圾回收,对新生代,老年代垃圾一起回收
JVM 垃圾回收器算法
串行回收器
并行回收器
并发回收器 CMS
G1 回收器
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
秒杀系统对系统的性能要求非常高,系统部署多少台服务器,能够提供最大的吞吐能力,应对最大的并发能力是架构师做架构选择的架构点。主要的挑战就是高并发。
核心的架构方案的设计原则
静态化
采用 JS 自动更新技术将动态页面转化为静态页面
并发控制,防秒杀器
设置阀门,只放最前面的一部分人进入秒杀系统
三道阀门的设计:基于 TT 的计数器
简化流程
砍掉不重要的分支流程,如下单页面的所有数据库查询
以下单成功作为秒杀成功标志。支付流程只要在 1 天内完成即可。
砍掉填写或选择收货地址,放在秒杀成功后填写。
砍掉调用是否开通支付接口,秒杀首页文案提示必须开通。
采用内存缓存, 秒杀 Offer 数据,支付相关信息,缓存
前端优化
采用 YSLOW 原则提升页面响应速度
应急预案
评论