常见的gc算法有哪些?

java garbage collection是一个自动进程,用于管理程序使用的运行时内存。通过自动执行JVM,可以减轻程序中分配和释放内存资源的开销。

垃圾回收机制是由垃圾回收器Garbage Collection来实现的。GC是后台的守护进程,它的特别之处是它是一个低优先级进程。但是可以根据内存的使用情况动态的调整他的优先级,因此,它是内存中低到一定程度时,才会自动运行,从而实现对内存的回收,这就是垃圾回收的时间不确定的原因。这个服务不是我们启动的是自动启动的。

程序运行期间,所有对象实例存储在运行时数据区域的heap中,当一个对象不再被引用(使用),他就需要被回收,在GC过程中,这些不需要被使用的对象从heap中回收,这样就会有空间循环被利用。

引用计数法

简单但是速度很慢,缺陷是不能处理循环引用的情况。 
原理:此对象有一个引用,既增加一个计数器,删除一个引用减少一个计数器,垃圾回收时,只回收计数器为0的对象,此算法最致命的是无法处理循环引用的情况

3.标记-清除算法

标记清除算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。

之所以说他是最基础的收集算法,是因为后续的收集算法都是基于这种思路并且对其不足进行改进而得到的。

它的主要不足有两个:
1. 一个是效率问题,标记和清除两个过程的效率都不高
2. 另一个是空间问题,标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后再程序运行过程中需要分配较大对象时,无法找到足够的连续的内存而不得不提前触发另一次垃圾收集动作。

4.复制算法

为了解决效率问题,一种称为“复制”(Copying)的收集算法出现了,它将可用的内存按照容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况。只要移动堆指针,按照顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为原来的一半。

5. 标记-整理算法

复制收集算法在对象存活率较高的时候,就要进行较多的复制操作,效率将会变低。更关键的是,如果不想浪费50%的空间,就需要额外的空间进行分配担保,以应对被使用的内存中所有对象都是100%存活的极端情况,所以在老年代一般不能直接选用这种算法。根据老年代的特点。有人提出了另外一种“标记-整理”(Mark-Compact)算法,标记过程仍然与”标记-清除”算法一样,但是后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界意外的内存。

6.分代收集算法

这种算法并没有什么新的思路,只是根据对象的存活周期的不同,将内存划分为几块。一般是把java堆分成新生代和老年代,这样就可以根绝各个年代的特点采取最适当的收集算法。在新生代中,每次垃圾回收时都发现大批对象的死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高,没有额外空间对它进行分配担保,就必须使用”标记-清理”或者“标记-整理”算法来进行回收。

7.系统线程划分

串行收集器

使用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高。但是,也无法使用多处理器的优势。所以此收集器适合单处理器的机器。当然,此收集器也可以用在小数量(100M左右)情况下的多处理器机器上,可以使用-XX:+UseSerialGC打开。

并行收集器

对年轻代进行并行垃圾回收,因此可以减少垃圾回收的时间,一般在多线程多处理器上使用,使用-XX:+UseParallelGC打开。年老代进行并行收集。如果年老代不使用并发收集的话,是使用单线程进行垃圾回收,因此会制约扩展能力,使用-XX:+UseParallelOldGC打开。

使用-XX:ParallelGCThreads=设置并行垃圾回收的线程数,此值可以设置与机器处理数量相等。
此收集器可以进行如下配置:
最大垃圾回收暂停:指定垃圾回收时的最大暂停时间,通过-XX:MaxGCPauseMillis=指定。为毫秒数,如果指定了这个值的话,堆大小和垃圾回收相关参数会进行调整以达到指定值。此值可能会减少应用的吞吐量。吞吐量:吞吐量为垃圾回收时间与非垃圾回收时间的比值。通过-XX:GCTimeRatio=来设定,公式为1/(1+N),例如,-XX:GCTimeRatio=19时,表示5%的时间用于垃圾回收,默认情况为99,既1%的时间用于垃圾回收。

并发收集器

可以保证大部分工作都并发执行(应用不停止),垃圾回收只暂停很少的时间,此收集器适合对响应时间要求比较高的中,大型应用,使用-XX:+UseConcMarkSweepGC打开。

并发收集器主要减少年老代的暂停时间,他在应用不停止的情况下使用独立的垃圾回收线程,跟踪可达对象,在每个年老代垃圾回收周期中,在收集初期并发收集器会对整个应用进行简短的暂停,在收集中还会再暂停一次,第二次暂停会比第一次长,在此过程中多个线程同时进行垃圾回收工作。

并发收集器使用处理器换来短暂的停顿时间,在一个N个处理器的系统上,并发收集部分使用K/N个可用处理器进行回收,一般情况下1<=K<=N/4

在只有一个处理器的主机上使用并发收集器,设置为incremental mode模式也可以获得较短的停顿时间。

浮动垃圾:由于在应用运行的同时进行垃圾回收,所以有些垃圾回收可能在垃圾回收完成时产生,这样就造成了“floating Garbage”,这些垃圾需要在下次垃圾回收周期时才能回收掉,所以并发收集器一般需要20%的预留空间用于这些浮动垃圾。

Concurrent Mode Failure:并发收集器在应用程序运行时进行收集,所以需要保证堆在垃圾回收的这段时间有足够的空间供程序使用,否则,垃圾回收还未完成,堆空间先充满了,这种情况下将会发生“并发模式失败”,此时整个应用将会暂停。进行垃圾回收。

启动并发收集器:因为并发收集在应用运行时进行收集,睡衣必须保证收集完成之前有足够的内存空间供程序使用,否则会出现“Concurrent Mode Failure”,通过设置-XX:CMSinitiatingOccupancyFraction=指定还有多少剩余堆时开始执行并发收集。

并行:多个事件同一时间发生,同时做多件事
并发:多个事件在同一个时间间隔内发生。每年11.11日狂欢节,一天内接受的最大人数。

来源自:
---------------------
作者:九师兄-梁川川
来源:CSDN
原文:https://blog.csdn.net/qq_21383435/article/details/80473540
版权声明:本文为博主原创文章,转载请附上博文链接!

面试题——常见的gc算法有哪些?的更多相关文章

  1. 常见GC算法,CMS以及G1的垃圾回收过程,CMS的各个阶段哪两个是Stop the world的,CMS会不会产生碎片,G1的优势。

    常见GC算法 在C/C++中是由程序员自己去申请.管理和释放内存的,因此没有GC的概念.而在Java中,专门有一个用于垃圾回收的后台线程来进行监控.扫描,自动将一些无用的内存进行释放.下面介绍几种常见 ...

  2. 深入探究Lua的GC算法(上)-《Lua设计与实现》

    对于内存的管理,是程序在应用的时候的必需知识点,<Lua设计与实现>中对Lua语言的GC原理做了一个详细的讲解,云风的blog也对其进行了详尽的讲解Lua GC 的源码剖析 系列 给出作者 ...

  3. 常用GC算法

    在C/C++中是由程序员自己去申请.管理和释放内存的,因此没有GC的概念.而在Java中,专门有一个用于垃圾回收的后台线程来进行监控.扫描,自动将一些无用的内存进行释放.下面介绍几种常见的GC算法. ...

  4. JVM学习(4)——全面总结Java的GC算法和回收机制

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置 Java堆的分配参数 -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的 ...

  5. JVM常见垃圾回收算法

    jdk1.7.0_79 众所周知,Java是一门不用程序员手动管理内存的语言,全靠JVM自动管理内存,既然是自动管理,那必然有一个垃圾内存的回收机制或者回收算法.本文将介绍几种常见的垃圾回收(下文简称 ...

  6. JVM GC算法

    在判断哪些内存需要回收和什么时候回收用到GC 算法,本文主要对GC 算法进行讲解. JVM垃圾判定算法 常见的JVM垃圾判定算法包括:引用技术算法.可达性分析算法. 引用技术算法(Reference ...

  7. GC参考手册 —— GC 算法(基础篇)

    本章简要介绍GC的基本原理和相关技术, 下一章节再详细讲解GC算法的具体实现.各种垃圾收集器的实现细节虽然并不相同,但总体而言,垃圾收集器都专注于两件事情: 查找所有存活对象 抛弃其他的部分,即死对象 ...

  8. JVM垃圾回收(三)- GC算法:基础

    GC算法:基础 在介绍GC算法在实际场景中的实现之前,我们先定义一些必要的术语,以及GC算法的基本准则.具体的细节会因收集器的不同而稍有区别,但是基本上来说,所有的收集器会关注以下两个方面: 找出所有 ...

  9. JVM学习(4)——全面总结Java的GC算法和回收机制---转载自http://www.cnblogs.com/kubixuesheng/p/5208647.html

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置 Java堆的分配参数 -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的 ...

随机推荐

  1. unity三维地球模型生成

    准备一张贴图   创建材质球 球面坐标系转直角坐标系 x=rsinθcosφ. y=rsinθsinφ. z=rcosθ. 效果如下   脚本如下 using System.Collections; ...

  2. javaweb期末项目-stage3-项目测试和发布

    项目综合报告.项目测试.项目部署 .rar---下载 说明:解压密码为袁老师的全名拼音(全小写) 相关链接: 项目结构:https://www.cnblogs.com/formyfish/p/1082 ...

  3. 51nod1050 循环数组最大子段和

    思路: 分两种情况讨论. 实现: #include <bits/stdc++.h> using namespace std; typedef long long ll; ; ll sum[ ...

  4. Ubuntu14.04LTS 下配置Tomcat Hadoop eclipse环境

    下在相关软件: (genju yingjian xuanze xitong weishu,根据系统是32位还是64位选择软件的版本:jdk和eclipse) HADOOP:http://mirrors ...

  5. pytorch安装问题

    目录 1.版本 2.pytorch调试中出现的Module 'torch' has no 'zero' member如何解决 3.No module named 'numpy.core._multia ...

  6. [Agc028B]Removing Blocks_排列组合

    Removing Blocks 题目链接:https://atcoder.jp/contests/agc028/tasks/agc028_b 数据范围:略. 题解: 这种问题的第一步很套路,就是对于每 ...

  7. Java模版引擎之Freemarker

    Java模版引擎之Freemarker freemarker是一款模版引擎,是一种基于模版生成静态文件的通用工具,它是为Java程序员提供的一个类库,它不是面向最终用户的,而是为程序员提供了一款可以嵌 ...

  8. 和HTTP相关的web服务器内容

    一台web服务器可以搭建多个独立域名的网站,也可以作为通信路径上的中转服务器提升传输效率. 1. 用单台虚拟主机实现多个域名 多个域名解析后对应的ip地址相同,需要在Host首部中包含完整的主机名或者 ...

  9. Linux系列(13)之程序与服务的概念

    知道如何区分程序与进程吗? 知道如何产生进程吗? 知道进程之间的相关性吗? 知道进程调用的流程吗? 知道进程与服务的区别吗? 1.程序与进程的区别 bash就是一个程序,当我们登录之后系统就会给我们分 ...

  10. windows scala helloworld例子详解

    [学习笔记] windows scala helloworld例子详解: 在操作系统中,我们的Test3.scala会生成Test3.class,然后class文件被虚拟机加载并执行, 这一点和jav ...