面试java中,jvm中的垃圾收集算法一般都会问一下,下面来总结一下这个经常提到的问题。
第一种:标记清除
它是最基础的收集算法。
原理:分为标记和清除两个阶段:首先标记出所有的需要回收的对象,在标记完成以后统一回收所有被标记的对象。
特点:(1)效率问题,标记和清除的效率都不高;(2)空间的问题,标记清除以后会产生大量不连续的空间碎片,空间碎片太多可能会导致程序运行过程需要分配较大的对象时候,无法找到足够连续内存而不得不提前触发一次垃圾收集。
地方 :适合在老年代进行垃圾回收,比如CMS收集器就是采用该算法进行回收的。

第二种:标记整理
原理:分为标记和整理两个阶段:首先标记出所有需要回收的对象,让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
特点:不会产生空间碎片,但是整理会花一定的时间。
地方:适合老年代进行垃圾收集,parallel Old(针对parallel scanvange gc的) gc和Serial old收集器就是采用该算法进行回收的。

第三种:复制算法
原理:它先将可用的内存按容量划分为大小相同的两块,每次只是用其中的一块。当这块内存用完了,就将还存活着的对象复制到另一块上面,然后把已经使用过的内存空间一次清理掉。
特点:没有内存碎片,只要移动堆顶指针,按顺序分配内存即可。代价是将内存缩小位原来的一半。
地方:适合新生代区进行垃圾回收。serial new,parallel new和parallel scanvage
收集器,就是采用该算法进行回收的。
复制算法改进思路:由于新生代都是朝生夕死的,所以不需要1:1划分内存空间,可以将内存划分为一块较大的Eden和两块较小的Suvivor空间。每次使用Eden和其中一块Survivor。当回收的时候,将Eden和Survivor中还活着的对象一次性地复制到另一块Survivor空间上,最后清理掉Eden和刚才使用过的Suevivor空间。其中Eden和Suevivor的大小比例是8:1。缺点是需要老年代进行分配担保,如果第二块的Survovor空间不够的时候,需要对老年代进行垃圾回收,然后存储新生代的对象,这些新生代当然会直接进入来老年代。

优化收集方法的思路
分代收集算法
原理:根据对象存活的周期的不同将内存划分为几块,然后再选择合适的收集算法。
一般是把java堆分成新生代和老年代,这样就可以根据各个年待的特点采用最适合的收集算法。在新生代中,每次垃圾收集都会有大量的对象死去,只有少量存活,所以选用复制算法。老年代因为对象存活率高,没有额外空间对他进行分配担保,所以一般采用标记整理或者标记清除算法进行回收。


PS:2019/7/13 22:25
对于以上两种标记算法存在争议,在深入了解JVM最佳实践第二版中,是写的标记需要回收的对象,我也没太深入思考,直到有人提出来,我也去查了一下和想了一下。我个人现在偏向,标记存活的对象。
标记算法的大概流程:通过引用链给所有存活的对象做个标记,然后回收所有没有标记的对象 和 清除存活对象的标记,等待下一次GC


GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,优化收集方法的思路相关推荐

  1. 简介三种垃圾回收机制:分代复制垃圾回收,标记垃圾回收,增量垃圾回收

    一.分代复制垃圾回收 不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比 ...

  2. LVS三种工作模式(NAT、DR、TUN)原理及配置

    首先声明文章出处:<Lvs之NAT.DR.TUN三种模式的应用配置案例 >是由helloworld发表于速学堂的一篇文章,感谢helloworld的分享,内容非常全面充实,因此转载作为复习 ...

  3. CSS line-height 三种赋值方式有何区别 (琐碎知识点整理)

    之前有整理过一部分知识点, 一直没有发布, 因为都是有关 前端 方面的零散内容; 现在想想无论分享什么内容都需要慢慢积累, 所以还是决定将之前整理的相关内容验证之后慢慢分享给大家 这个专题 就是 工作 ...

  4. 看了通信领域中信息的处理的三种方式我终于知道电报能发送信息的原理了

    方式一定长编码 方式二定长编码 方式三赫夫曼编码

  5. 26 Java GC算法 垃圾收集器、标记 -清除算法、复制算法、标记-压缩算法、分代收集算法

    26.Java GC算法 垃圾收集器 1.1.1标记 -清除算法 1.1.2复制算法 1.1.3标记-压缩算法 1.1.4分代收集算法 26.Java GC算法 垃圾收集器 概述 垃圾收集 Garba ...

  6. JVM的三种常见GC:Minor GC、Major GC与Full GC

    文章目录 JVM的GC JVM GC的种类 GC的触发机制 年轻代GC(Minor GC)触发机制 老年代GC(Major GC/Full GC)触发机制 Full GC触发机制 为什么需要把Java ...

  7. 三种引流方法案例分析

    第3课课程笔记 课程主题:三种引流方法&案例分析 课程题纲: 第一节:58同城引流方法详解(图文并茂) :宠物引流的第二种方法(资料收集与分享) :第三种最高端的玩法(让客户百分百信任你) 正 ...

  8. CSS清除浮动(float)的三种方式

    标题CSS清除浮动(float)的三种方式 为什么要清除浮动? 浮动的原理是让图片脱离文档流,直接浮在画面上.我们一般布局都是只设置宽度不设置高度,让内容来填充高度.但利用浮动后会让原本填充的高度消失 ...

  9. PHP中添加HTML代码的三种方法(printEND)

    php中添加HTML代码,就是php类型的文件中添加html代码~ 第一种是在HTML中加PHP. 大段大段的html代码中,在各个需要执行php的地方<?php .... ?> 比如 l ...

最新文章

  1. 最新通知!多所高校明确:开学上网课!
  2. python中类的用法_Python中的类和方法使用举例
  3. 【Android UI设计与开发】第12期:顶部标题栏(三)ActionBar实现层级导航的返回效果
  4. Python面向对象2:类与对象的成员分析及self
  5. 四个常用的Java连接池
  6. 2.12.ECMAScript--运算符
  7. 图像配准代码(包含matlab/opencv C++)
  8. 五分钟没有操作自动退出_遇到不喜欢的小动物怎么办?教你五分钟友好的送走小动物!...
  9. c#和python同一主机直接udp_为什么Python 如此之慢
  10. Android activity启动模式
  11. 亲自动手用HTK实现YES NO孤立词识别
  12. c++ enum 给定类型_C++ 枚举类型详解
  13. ege和c语言做贪吃蛇,新萌 求大神给一个 EGE做的贪吃蛇代码 带注释的 没注释的看不懂...
  14. 成功编译无错MAC OpenJDK8:Terminating app due to uncaught exception ‘NSInternalInconsistencyException‘
  15. menu什么意思中文意思_telegraph什么意思
  16. (转)惊鸿一瞥:人工智能,改变研究方式的力量
  17. 移远BC95系列区别
  18. 平面几何常用定理、结论总结 第一篇 三角形及其引线、引圆
  19. android本地视频播放demo,基于Android的本地视频播放器
  20. JEECG常见问题大全

热门文章

  1. CocosCreator 龙骨换装
  2. CF1638E. Colorful Operations 珂朵莉树+差分树状数组
  3. 简单的统计学:如何用Python计算扑克概率
  4. 再生核希尔伯特空间(Reproducing Kernel Hilbert Space)
  5. 体验了杭州的最多跑一次,这是IT的胜利
  6. mysql使徒化_有关使徒行传的4件简单的事情要记住
  7. 关于在C++中进行json解析的问题(菜鸟的笔记)
  8. 人生男女的30个经典幽默
  9. 此生若得安稳,谁愿颠沛流离!
  10. linux下使用mysql