架构师训练营第九周命题作业
请简述 JVM 垃圾回收原理。
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
1 JVM 垃圾回收原理
首先通过可达性分析算法来判断对象是否被引用,从根开始进行标记,对于没有引用的垃圾对象进行回收。
回收主要有三种方法:
清理:将垃圾对象占据的内存空间标记为空闲
压缩:将存活的对象从堆头开始连续排列
复制:将堆分为两部分,只在一部分创建对象,当占满时,将存活对象复制到另一个部分中
分代垃圾回收
将堆空间分成新生代和老年代,一般老年代空间大于新生代空间,再进一步将新生代区域分为 Eden 区和两个 From/To 区。新申请的对象会被分配到 Eden 区,当 Eden 区占满时,进行 YoungGC,把 Eden 区和一个 From/To 区中的对象清理标记并复制到另一个 From/To 区,这样可以保证有一个 From/To 区是空的,如此循环。
当有对象不断的在两个 From/To 区之间复制而且仍然保持存活,则该对象会被复制到老年代。
当 Eden 区和 From/To 区的存活对象大于另一个 From/To 区的空间时,进行 FullGC,将所有区域进行回收,节省出空间后,将一部分对象复制到老年代,继续操作 。
垃圾回收器
常见的垃圾回收器有下面几种
串行回收器用于单核 CPU,此时增加 GC 线程没有益处。并行回收器与并发回收器 CMS 都可用于多核 CPU,并行回收器算法简单,stop the world 时间长于并发回收器,但总体资源消耗更低,从整体来看效率高于并发回收器,适用于以计算为主要目的的场景;并发回收器将回收过程的标记和清理分离,将能够并发处理的部分同应用线程并发执行,从而大幅降低的 stop the world 时间,但总体资源消耗升高,适用于 web 应用。
2 秒杀系统
版权声明: 本文为 InfoQ 作者【whiter】的原创文章。
原文链接:【http://xie.infoq.cn/article/9e9fc58f6420e75fe2d6a6edb】。未经作者许可,禁止转载。
评论