写点什么

第 9 周作业

用户头像
破晓_dawn
关注
发布于: 2020 年 08 月 04 日

请简述JVM垃圾回收原理



垃圾回收主要需要解决的问题有:

1.如何知道哪些对象需要回收?

2.如何回收?

3.回收过程中的内存管理

4.回收的过程



  1. 哪些对象需要回收

JVM通过可达性算法,来识别对象是否需要被回收。如果一个对象被另一个对象应用,另一个对象被根引用,则对象为有用的对象。具体为,从根对象出发逐层标记引用的对象,以及对象引用的对象,找到所有被引用的对象,没有被标记的对象为垃圾对象。标记完后,将没有被标记的对象垃圾回收。

  1. 如何回收? 回收过程中的内存管理

回收的手段有三种:清理、压缩、复制

清理:把不连续的垃圾对象的空间记录。这种方法的问题是:可以空出很大空间,但是为碎片空间

压缩:把后面的对象,向前拷贝。剩下连续的可用空间

复制:空间分为两块,将可用的连续对象,拷贝到另一块空间中。

  1. 内存的分代回收

为了提高效率,JVM把对象放置到不同的空间。

刚创建出来的对象,只有少部分被长期引用,大部分对象,生存空间短。

分配新生代空间,创建出来的对象先放到新生代,当新生代满了,扫描新生代,进行回收。使用较少的空间,扫描较少的对象,进行回收。长期使用的对象,移动到老年代。

具体回收过程如下:



创建对象,放入Eden区,当Eden区满了,启动Eden区的垃圾回收。

将有应用的对象放到From区,Eden区清空。

如果Eden区再次满,扫描,将Eden区和From有应用的对象,放入到to区。

下次再满了,对于Eden区和To区有引用的对象,拷贝到From区。

多次拷贝,如果一直在From或to区的对象,拷贝到老年代。

如果空间再满了,进行一次全量的回收,即Full GC。

  1. JVM垃圾回收算法

分为四种算法:串性回收、并行回收、回收并发器、G1回收器

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

秒杀系统的压力在于并发请求。

对秒杀时的峰值并发进行预估,系统设计需要可以抗住峰值流量。

可能的问题及解决思路:

  1. 优化当前系统开发量巨大

系统重构工作量巨大,最好的方法是建立一个新的系统。既方便资源的调配,也不会对现有系统造成影响。

  1. 带宽压力、数据库压力

页面需要动静分离。对于访问商品的列表的页面以及商品详情的页面,由于秒杀的商品是固定的,可以给开通商品配置通道,将数据写到缓存。用户访问直接访问缓存,而不是数据库。从而减轻数据库压力。

对于图片等,占用带宽的资源,建立图片服务器。

对于传输的数据,也可以进行压缩,减少数据量。

  1. 防止用户找到提交页面

在秒杀开始之前,要需要页面中不可用有订单提交的页面。否则,可能用户直接访问,秒杀未开始先下单买到了商品。

建立valid-offer.js,用户刷新浏览器访问时,其他内容从浏览器缓存中获取,只有这个问题是从服务器实时获取。在秒杀开始的时间,通过这个文件,做提交页面展示的开关。

  1. 流量限制

可以使用TT计数器等。只放入秒杀开始后的,前n个请求,为用户现实排队中,进行后续的处理,其他请求可以直接给用户返回秒杀结束。

为了增加秒杀功能性(或用户感知更公平),可以在在进入秒杀、进入下单、进入支付三个页面,逐步通过计数器进行限流。

  1. 应急预案

和原有业务尽可能分离,防止影响;准备有备用服务器,看那个服务压力大了,及时扩容;如果服务扛不住要跳转到万能页面等等。



发布于: 2020 年 08 月 04 日阅读数: 51
用户头像

破晓_dawn

关注

慢慢,稳稳 2017.12.06 加入

业余选手,但是有一颗向往专业的心

评论 (1 条评论)

发布
用户头像
作业请添加”极客大学架构师训练营“标签,便于分类查找~
2020 年 08 月 05 日 14:11
回复
没有更多了
第9周作业