week9. 课后作业

用户头像
个人练习生niki
关注
发布于: 2020 年 08 月 02 日



  • 请简述 JVM 垃圾回收原理。

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



JVM垃圾回收指将JVM堆中已经不再使用的对象清理掉,释放宝贵的内存资源。

通过可达性分析算法识别垃圾对象。该方法的基本思想是通过一系列的“GC Roots”对象作为起点进行搜索,将这些变量引用的对象进行标记,然后看这些被标记的对象是否引用了其他对象,继续进行标记,所有被标记的对象都是被使用的对象,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达,就是可回收的垃圾对象了。

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

第一种是虚拟机栈中的引用的对象,我们在程序中正常创建一个对象

第二种是我们在类中定义了全局的静态的对象,也就是使用了static关键字

第三种便是常量引用,就是使用了static final关键字

第四种本地方法栈中(Native方法)引用的对象

回收方法

清理:将垃圾对象占用的内存空间标记为空闲,记录在一个空闲列表里。当应用程序需要创建对象时,从空闲列表里找一段空闲内存分配给次对象。容易产生碎片

压缩:从堆空间的头部开始,将存活的对象拷贝放在一段连续的内存空间中,那么剩余的内存就算连续的空闲空间

复制:将堆空间分为两部分,只在一部分中创建对象,当这部分空间用完时,将标记过的可用对象复制到另一个空间中。



分代垃圾回收

Java将堆内存分为新生代、老年代。其中新生代分为Eden区、From区、To区。应用中大部分对象生命周期极短,创建的对象放在Eden区+From区,当Eden区+From区满了之后触发一次Yong GC,把其中存活的对象拷贝到To区,其余的对象清理掉,对存活的对象生存年龄加一,From区就是空的。下次Eden区+To区满了之后,会将对象拷贝到From区,对存活的对象生存年龄加一,To区就是空的。多次垃圾回收后,当对象的生命周期达到一定数量【默认15】之后会将对象放到老年代。老年代满了之后会触发Full GC,比较慢。

通常新生代比老年代小很多,新生代小,垃圾回收的速度会快很多。



垃圾回收器

串行回收器在早期单CPU机器时使用,垃圾回收时,停止应用访问【STW】,垃圾回收完成后恢复使用。这种单线程的机制是最高效的,多线程是没有意义的。

并行回收器在多核CPU时使用,并行垃圾回收,STW时间更短。但程序还是会不能响应,对用户体验不好。

并发回收器CMS-concurrent marks sweep.应用程序的线程和垃圾回收线程并行执行。应用程序在使用时垃圾回收标记是不可能标记完,所以还是需要STW,但分为四个流程后,STW时间就变短了。清理也是并发清理,对用户影响较小。

Java1.7之后主推G1垃圾回收器

默认将堆分为2000个小区域,这样回收的速度会更快,使用简单,使用的参数也少,比CMS少很多



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

做一个真诚、坦诚的行人,追求自由。 2018.07.30 加入

还未添加个人简介

评论

发布
暂无评论
week9.课后作业