九周作业
一、请简述 JVM 垃圾回收原理
垃圾回收是 java 的一大特色,解放了开发人员,大家都不需要关注内存了。
java 的垃圾回收理念这么多版本以来一直没变,主要分为
1、新生代
2、老年代
其中新生代又分为 eden,和两个大小相等的 survivor,他们的大小比例默认为 8:1:1。基于大部分对象朝生夕灭的特性,一般的对象创建后主要放在新生代 eden。一次 young GC 后,eden+一个 survivor 假如对象还存活,则进入另一个 survivor 区。而老年代主要存放大对象和经过 15 次 young GC 扔存活的对象。
然后。。JDK8 开始,原数据区 metaSpace 也被列入垃圾回收管理范围。
垃圾回收算法
由于新生代和老年代垃圾存活度不一样,又研究出了几种垃圾回收算法
标记清除
标记出无用对象,然后清除,常用于老年代,缺点会产生内存碎片
复制算法
针对新生代大部分对象 GC 时已死的特性,仅复制存活对象到 survivor 区,然后清空 eden 和另一个 survivor
标记整理
由于标记清除会出现内存碎片,所以在标记清除之后,把存活的对象搬到一起,避免碎片空间浪费,这就是标记整理,用于老年代
垃圾回收器
垃圾回收过程中,由于垃圾回收的过程不一样,研究出了几种垃圾回收器,它们主要分为:
1、串行垃圾回收:单线程处理垃圾回收过程(缺点很明显,但是当时 CPU 单核)
2、并行垃圾回收:多线程处理垃圾回收过程(产生于多核 CPU 盛行后)
3、并发垃圾回收:仅在标记时 STW,垃圾回收时不暂停,可以与其他线程一起执行,减小 GC 暂停时间
由于负责的区域不同,由这 3 种类型产生了多种垃圾回收器:
1、新生代串行 serial,新生代并行 parNew,新生代基于吞吐量并行 parallel Scavenge
2、老年代串行 serial Old, 老年代并行 Parallel
3、老年代并发 CMS
其中他们的组合模式如上图连线。
JDK8 之后,产生了一种新的垃圾回收器 G1,它直接处理了新生代和老年 GC,它属于并发垃圾回收器,过程与 CMS 相似,很大的特点是它将内存分成很多大小在 1M-32M 的 region,部分 region 属于新生代,部分属于老年代。
G1 主要用于解决超大堆 GC 暂停时间长的问题。
G1 维护了一个 region 列表,脏内存比例较大的 region 排在前面。这样 GC 的时候,它只选择部分脏数据比例较大的 region 进行垃圾回收,达到了高效,快速(部分回收)的效果。
G1 已经很优秀了,燃鹅。。另一款更优秀的垃圾回收器 ZGC 已经诞生了,据说它以后将成为默认垃圾回收器。
二、设计一个秒杀系统主要的挑战和核心问题有哪些?核心的架构方案和思路有哪些?
首先,秒杀系统应对的是大量并发,那么它必须要满足高性能。应对海量请求在瞬间爆发,怎么避免用户不卡顿,服务器不宕机?这就需要从用户到服务器各个节点上使出浑身解数,大力提高性能。
秒杀系统的挑战
秒杀系统架构方案:
1、增加网络带宽
2、设置 CDN 缓存
3、页面静态化,秒杀入口 URL 在秒杀前 2s 生成
4、大量使用 redis 缓存,应对用户登录等秒杀前服务
5、降低秒杀商品列表,图片等大小
6、缓存商品库存,服务器本地缓存秒杀结束状态,从页面根据秒杀请求量限流,后续节点根据服务器能力限流
7、设置秒杀结束页面,所有异常均导流到秒杀结束页面
8、网关白名单,对秒杀器拒绝访问
版权声明: 本文为 InfoQ 作者【独孤魂】的原创文章。
原文链接:【http://xie.infoq.cn/article/229c7a55a697719a5d1b30992】。未经作者许可,禁止转载。
评论