架构师训练营 - 第九周 - 作业
请简述 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时间不要太长、根据系统应用来定。
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
秒杀其实主要解决两个问题,一个是并发读,一个是并发写。
请求数据尽量少,从而减少cpu消耗
访问路径尽量短,减少节点消耗
强依赖尽量少,减少加载时间
不要有单点,要有备份
减少额外请求,减少加载时间
对页面进行彻底的动静分离,使得用户秒杀时不需要刷新整个页面,而只需要点击抢宝按钮,借此把页面刷新的数据降到最少;
在服务端对秒杀商品进行本地缓存,不需要再调用依赖系统的后台服务获取数据,甚至不需要去公共的缓存集群中查询数据,这样不仅可以减少系统调用,而且能够避免压垮公共缓存集群。
增加系统限流保护,防止最坏情况发生。
Plan B 方案来兜底:降级、限流和拒绝服务。
版权声明: 本文为 InfoQ 作者【Anrika】的原创文章。
原文链接:【http://xie.infoq.cn/article/d58f1120157ac940621497803】。文章转载请联系作者。
评论