写点什么

架构师训练营 - 第九周 - 作业

用户头像
Anrika
关注
发布于: 2020 年 08 月 05 日
架构师训练营 - 第九周 - 作业

请简述 JVM 垃圾回收原理。

Java GC主要做三件事:

1、哪些内存需要GC?

Java GC针对的是JVM中堆和方法区。

程序计数器、虚拟机栈、本地方法栈是每个线程私有内存空间,随线程而生,随线程而亡,无需考虑回收。

GC主要进行回收的内存是JVM中的方法区和堆,涉及到多线程、多个对该对象不同类型的引用

2、何时需要执行GC?

Java GC垃圾回收机制,回收的是已死的Java对象。

Java GC机制启动之前,需要确定堆内存中哪些对象是存活的,一般有两种方法:引用计数法和可达性分析法。

引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。引用计数法实现简单,判定高效,但不能解决对象之间相互引用的问题。

可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

3、以何策略执行GC?

分代分配,分代回收。

GC分代回收算法假设:绝大部分对象的生命周期都非常短暂,存活时间短。

把Java堆分为新生代和老年代,在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法;老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。

JVM性能调优建议:

1、初始化内存和最大内存尽量保持一致,避免内存不够用继续扩充内存。最大内存不要超过物理内存,例如内存8g,你可以设置最大内存4g/6g但是不能超过8g否则加载类的时候没有空间会报错。

2、gc/full gc频率不要太高、每次gc时间不要太长、根据系统应用来定。



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

秒杀其实主要解决两个问题,一个是并发读,一个是并发写。

  1. 请求数据尽量少,从而减少cpu消耗

  2. 访问路径尽量短,减少节点消耗

  3. 强依赖尽量少,减少加载时间

  4. 不要有单点,要有备份

  5. 减少额外请求,减少加载时间

对页面进行彻底的动静分离,使得用户秒杀时不需要刷新整个页面,而只需要点击抢宝按钮,借此把页面刷新的数据降到最少;

在服务端对秒杀商品进行本地缓存,不需要再调用依赖系统的后台服务获取数据,甚至不需要去公共的缓存集群中查询数据,这样不仅可以减少系统调用,而且能够避免压垮公共缓存集群。

增加系统限流保护,防止最坏情况发生。

Plan B 方案来兜底:降级、限流和拒绝服务。



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

Anrika

关注

还未添加个人签名 2018.08.21 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 - 第九周 - 作业