写点什么

第九周大作业

用户头像
小兵
关注
发布于: 2020 年 12 月 20 日
  • 请简述 JVM 垃圾回收原理。

第一阶段:通过可达性分析算法识别可回收的对象

具体是通过 GC Roots 开始,所有不可达对象都可以作为回收对象。

GC Roots 包括但不限于:

1,虚拟机栈中引用的对象,

2,方法区中静态变量引用的对象,

3,方法区中常量引用的对象,

4,本地方法栈中引用的对象。

 

第二阶段:回收可回收对象,

ava 堆划分为新生代和老年代,分别用于管理不同存活时间的对象,新创建的兑现分配在年轻代,经过多次垃圾回收而没有被回收的对象会被移到老年代。

针对新生代和老年代 JVM 采用了不同的垃圾回收算法。

1,新生代采用复制清除算法:新生代被划分为较大的 Eden 区和两块较小的 Survivor 区,默认比例是 8:1:1,回收 Eden 区和其中一块 Survivor 区后,将存活对象复制到 Sruvivor 区。

采用这种算法的原因在于,java 对象的生存周期都比较短,每次垃圾回收都会产生大量的碎片,如果采用整理算法的话,进行移动的对象会比较多。

2,老年代采用的算法是标记整理,原因是老年代的对象存活周期比较长,每次只会回收较少的对象,如果进行复制的话,需要的备用空间比较大。

 

无论是标记清除还是标记整理,在虚拟机中都有多种不同的实现,如下


主要区别在于,采用的是单线程还是多线程。

JVM 提供了默认的垃圾回收器,用户也可以根据自己的需求采用合适的算法。


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


秒杀系统的挑战如下:

1, 高并发,可能超出平时数十倍,百倍的并发量,导致带宽耗尽,服务器奔溃。

2, 恶意请求:,通过秒杀器,带来更高的并发

3, 链接暴露,秒杀开始前就下单链接直接下单。

4, 超卖,订单量超过秒杀商品数量,如实发货带来经济损失,不发货带来信誉损失。

 

解决方案:

1,高并发:

单一职责,建立独立的秒杀系统,单独部署应用服务器和数据库服务器,隔离其他服务器,就算没有扛住高并发,也不会影响到其他服务。

 动静分离,将商品图片等静态信息和动态信息分离,采用 CDN,Nginx 等方式进行缓存,避免请求直接打到服务器。

 限流,秒杀商品数量有限,即有效请求也是有限的,只允许一定数量的请求打到服务器端。其他的返回秒杀结束。

 服务器端缓存,将库存数据提前缓存在缓存服务器,比如 redis,然后异步方式同步到数据库中。

 

2,恶意请求:

  增加答题的方式来限制秒杀器,同时可以拉长请求时间,打到降低并发的目的。

 

3,链接暴露:通过 URL 动态化,定时推送 URL 的方式,比如将 MD5 的方式生成的防止链接的暴露。

 

4,超卖:保证库存的读取和扣减的原子性即可,redis+lua 的方式可以实现。


用户头像

小兵

关注

还未添加个人签名 2018.10.07 加入

还未添加个人简介

评论

发布
暂无评论
第九周大作业