架构训练营第九周 - 作业

用户头像
无心水
关注
发布于: 2020 年 07 月 30 日
架构训练营第九周 - 作业

作业



  1. 请简述JVM垃圾回收原理

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



作业一

通过收集和删除未引用的对象来释放内存。





对象是否存活



在堆里面存放着Java世界几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事就是要判断对象是否存活。



引用计数算法



引用计数算法(Reference Counting)实现简单,判定效率也很高。给对象中添加一个引用计数器,每当一个地方引用它时,计数器值就加1;引用失效时,计数器值就减1;计数器为0的对象就是不可能再被使用的。



Python语言、游戏脚本领域被广泛应用的Squire中都使用了引用计数算法进行内存管理。但是,java虚拟机里没有用,主要原因是很难解决对象之间相互循环引用的问题



可达性分析



可达性分析(Reachability Analysis),基本思路是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始往下搜索,搜索所走过的路程称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象不可用。



Java语言中,可作为GC Roots的对象包括以下几种:



  • 虚拟机栈(栈帧中的本地变量表)中引用的对象;

  • 方法区中类静态属性引用的对象

  • 方法区中常量引用的对象

  • 本地方法栈中JNI(Native方法)引用的对象



垃圾收集算法



常见的垃圾收集算法。



标记-清除算法



算法分为‘标记’、‘清除’两个阶段。



首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。



复制算法



复制(Copying),将可用内存按容量分为大小相等的两块,每次只使用其中的一块。 当这一块的内存用完了,将还存活的对象复制到另外一块上去。把已使用过的内存空间一次清理掉。



实现简单,运行高效,内存使用率不高,用于回收新生代。



IBM研究表明,新生代中98%的对象都是在第一次GC时被回收掉,不需要按照1:1分配空间。



HotSpot虚拟机默认Eden和Survivor比例是8:1,只有10%的内存会被浪费。



Survivor空间不够时,需要依赖老年代进行分配担保,新生代收集下来的存活对象直接进入老年代。



标记-整理算法



标记-整理(Mark-Compact)算法,标记所有存活对象,向一端移动,然后直接清理掉端边界意外的内存。



分代收集算法



根据对象存活周期不同,将Java堆分为新生代和老年代。



新生代,采用复制算法。



老年代采用‘标记-清理’或者‘标记-整理’算法。



垃圾收集器



如果说,收集算法是内存回收的方法论,那么,垃圾收集器就是内存回收的具体体现。



Java虚拟机规范没有规范如何实现垃圾收集器。不同的厂商、版本的虚拟机实现可能会有很大差别。



下面,基于JDK1.7 Update14之后的HotSpot虚拟机讨论收集器。





作业二



发布于: 2020 年 07 月 30 日 阅读数: 7
用户头像

无心水

关注

路漫漫其修远兮 2018.08.16 加入

熟悉Java,略懂Python

评论

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