【架构师训练营第 1 期 09 周】 作业
【架构师训练营第 1 期 09 周】 作业
1.请简述JVM垃圾回收原理
目的:JVM垃圾回收就是将JVM堆中已经不再被使用的对象清理,释放宝贵的内存资源。
什么是JVM垃圾:JVM通过一种可达性分析算法进行垃圾对象的识别,具体过程是:从线程栈帧中的局部变量,或者是方法区的静态变量出发,将这些变量引用的对象进行标记,然后看这些被标记的对象是否引用了其它对象,继续进行标记,所有被标记过的对象都是被使用的对象,而那些没有被标记的对象就是可回收的垃圾对象。
垃圾回收方法:
清理:删除堆空间中垃圾对象,保存存活对象,但是会导致零散的内存碎片,导致无法充分利用;
压缩:在清理垃圾之后,将存活对象内存地址变成连续的片区,减少内存碎片;
复制:将空间分成两部分,将存活对象都复制到其中一部分,这样所有内存就都统一保存到制定内存区域;
判断垃圾的方法:
JVM分代垃圾回收:
主要清理JAVA运行的时候创建出来很快就不再使用的对象。比如接口里面每次请求进来,都会有一些对象被创建,等接口返回数据结束之后,这些对象其实就没用了,可以垃圾回收掉,避免占用内存空间。而这些对象基本都会保存在新生代中,所以重点清理新生代里面不可达的对象。
新生代:包活Eden区、From区和To区,都是保存创建时间比较短的的对象;
Eden区:JAVA对象创建;
From区:使用垃圾回收清理Eden区后,将存活对象复制放到From区,Eden区重新变空;
To区:From区满了之后,清理后存活的对象全部复制到To区,清空From区和Eden区,这样Eden区可以重新创建对象;
老年代:如果过了一段时间对象都没有被回收,就会从新生代,转为老年代,老年代的对象在full GC的时候也会根据可达性分析,不可达的对象被清理。
新生代中的垃圾回收清理方式都叫做Young GC,如果涉及老年代的就是full GC,新生代和老年代都会进行垃圾回收。
内存空间比例 Eden:From:To = 8:1:1,其中Eden就用来创建新的对象,From区是垃圾回收的时候用复制思路,保存存活内存空间的。而在垃圾回收的过程中,Eden区和From区里都存在需要回收的对象,这样From区也会有内存碎片,所以添加了To区复制保存存活的内存对象,而且可以和From区形成互补,可以将To区的不可达内存对象清理后,复制到From区,这样就可以一直保持碎片整合。
具体实现:
串行回收器:单核CPU,所有用户线程停止工作,执行完垃圾回收之后再调度线程;
并行回收器:多核CPU,逐个核核的用户线程停止工作,执行完垃圾回收之后再调度线程;
并行回收器CMS:多次标记需要回收的内存,然后再重新标记,最后才清理,不用每次都停止所有线程;
G1回收器:主流,将内存空间分成2000个区域,每个小块进行垃圾回收,动态调整回收过程,对用户影响比较少,通过MaxGCPauseMills最大GC时间进行控制;
=================================分割线=======================================
2.设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
秒杀系统是应对秒杀营销活动而涉及的特殊系统。通过低价还有限量,让消费者冲动购买,提高关注度。
挑战和问题:
1.流量并发:流量会暴增到高峰期的100倍,而且持续一段时间,在开始前不断刷新和抢购时疯狂点击;
2.库存控制:限制好不要出现超卖问题,导致亏损;
3.防机器人刷抢;防止生效时都是通过机器人抢到,要有足够的安全校验机制;
4.页面url转换,秒杀生效;商品要在正式开始才能购买,不能提前被购买了,导致投诉;
思路:
整条链路交互逻辑梳理清楚,减少秒杀功能关联复杂的业务逻辑。尽量减少访问数据库,并且做好限制条件,减少服务器处理业务逻辑。而库存方面做好并发控制,进行提前测试。
1.静态化:结合秒杀系统的场景,将秒杀场景中的数据都做好预设,页面数据不用访问数据库,最多只访问缓存;
2.图片缓存:所有图片尽量压缩到最小,然后提前放到CDN服务器中,使这些页面的图片不用访问自己的服务器,降低访问流量;
3.限号访问:对于限量库存的秒杀业务,可以通过接口计数器,统计秒杀开始后被访问的次数,当然阀值不能太低,不然有的用户进来但不购买,却占用了访问次数,导致产品没卖完,后面的顾客却买不到;
4.及时防御机器人:对于一些请求过于频繁的ip地址进行黑名单限制,比如一秒发起10个查询请求的,基本可以判定是机器人,禁止进行秒杀;
5.库存控制:业务量不大可以使用队列逐个消耗库存,或者在redis预减库存,避免对数据库并发操作;
6.页面url控制:页面的产品id先放一个虚拟的id,等秒杀开始后,这个虚拟id才能被请求下单,或者页面替换成真正的产品id;
7.模拟压测:在测试环境按一比一的比例创建服务器进行模拟压测,确认可以承受的峰值,尽量使用外部的云服务器对系统进行大量请求,这样可以模拟出用户在公网访问的情景。然后再根据压测情况,判断需不需要进一步优化。
版权声明: 本文为 InfoQ 作者【Bear在挨踢】的原创文章。
原文链接:【http://xie.infoq.cn/article/6ae10d57c00236832003fa020】。文章转载请联系作者。
评论