写点什么

【架构师训练营】第九期作业

用户头像
云064
关注
发布于: 2020 年 08 月 06 日

请简述 JVM 垃圾回收原理。

在jvm中堆空间划分为三个代:年轻代(Young Generation)、年老代(Old Generation)和永久代(Permanent Generation)。年轻代和年老代是存储动态产生的对象。永久带主要是存储的是java的类信息,包括解析得到的方法、属性、字段等等。永久带基本 不参与垃圾回收。我们这里讨论的垃圾回收主要是针对年轻代和年老代。具体如下图。 



年轻代又分成3个部分,一个eden区和两个相同的survior区。刚开始创建的对象都是放置在eden区的。分成这样3个部分,主要是为了生命 周期短的对象尽量留在年轻代。当eden区申请不到空间的时候,进行minorGC,把存活的对象拷贝到survior。年老代主要存放生命周期比较长的 对象,比如缓存对象。具体jvm内存回收过程描述如下(可以结合上图):

  1. 对象在Eden区完成内存分配

  2. 当Eden区满了,再创建对象,会因为申请不到空间,触发minorGC,进行young(eden+1survivor)区的垃圾回收

  3. minorGC时,Eden不能被回收的对象被放入到空的survivor(Eden肯定会被清空),另一个survivor里不能被GC回收的对象也会被放入这个survivor,始终保证一个survivor是空的

  4. 当做第3步的时候,如果发现survivor满了,则这些对象被copy到old区,或者survivor并没有满,但是有些对象已经足够Old,也被放入Old区 XX:MaxTenuringThreshold

  5. 当Old区被放满的之后,进行fullGC



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

主要挑战和问题:

  1. 高并发

  2. 数据一致性



思路:

  1. 对经常访问的静态数据做缓存处理,做CDN缓存,减少对服务器的访问压力

  2. 控制同一ip的访问频率

  3. 做好秒杀的事务,产品数量的增减保证原子性

  4. 秒杀结果尽早返回,与流程无关逻辑起异步任务处理



用户头像

云064

关注

还未添加个人签名 2018.05.24 加入

还未添加个人简介

评论

发布
暂无评论
【架构师训练营】第九期作业