一、介绍

  • GC(Garbage Collection),垃圾收集
  • Java中,GC的对象是堆空间和永久区

二、GC算法

1. 引用计数法

  • 老牌垃圾回收算法
  • 通过引用计算来回收垃圾
  • Java中未使用,使用者有COM、ActionScript3、Python

实现:

  1> 对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;

  2> 当引用失效时,引用计数器就减1;

  3> 只要对象A的引用计数器的值为0,则对象A就不可能再被使用。

缺点:

  • 引用和去引用伴随加法和减法,影响性能
  • 很难处理循环引用

2. 标记-清除算法

  • 标记-清除算法是现代垃圾回收算法的思想基础。
  • 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。
  • 实现:
    • 在标记阶段,首先通过根节点,标记所有从根节点开始的可达对象。因此,未被标记的对象就是未被引用的垃圾对象。
    • 在清除阶段,清除所有未被标记的对象。

具体过程如下图所示:

缺点:

  • 会产生大量不连续的内存碎片。可能会导致在需要分配较大对象时,无法找到足够的连续的内存空间,而不得不提前进行另一次的垃圾收集动作。

3. 标记-压缩算法

  • 标记-压缩算法适合用于存活对象较多的场合,如老年代。
  • 它在标记-清除算法的基础上做了一些优化。
    • 和标记-清除算法一样,标记-压缩算法也首先需要从根节点开始,对所有可达对象做一次标记。
    • 但之后,它并不简单的清理未标记的对象,而是将所有的存活对象压缩到内存的一端。
    • 最后,清理边界外所有的空间。

具体过程如下图所示:

4. 复制算法

  • 与标记-清除算法相比,复制算法是一种相对高效的回收方法
  • 不适用于存活对象较多的场合 如老年代
  • 将原有的内存空间分为两块,每次只使用其中一块
    • 在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,
    • 之后,清除正在使用的内存块中的所有对象,
    • 最后,交换两个内存的角色,完成垃圾回收

具体过程如下图所示:

缺点:

  • 空间浪费,内存缩小为原来的一半。

5. 分代收集算法

  • 分代收集算法是目前大部分JVM的垃圾收集器采用的算法。
  • 依据对象的存活周期进行分类:短命对象归为新生代,长命对象归为老年代。
  • 根据不同代的特点,选取合适的收集算法
  • 少量对象存活(新生代),适合复制算法
  • 大量对象存活(老年代),适合标记清理或者标记压缩

三、Stop-The-World

  • Java中一种全局暂停的现象
  • 全局停顿,所有Java代码停止,native代码可以执行,但不能和JVM交互
  • 多半由于GC引起
    •   Dump线程
    •   死锁检查
    •   堆Dump

GC时为什么会有全局停顿?
  类比在聚会时打扫房间,聚会时很乱,又有新的垃圾产生,房间永远打扫不干净,只有让大家停止活动了,才能将房间打扫干净。

危害:

  • 长时间服务停止,没有响应
  • 遇到HA系统,可能引起主备切换,严重危害生产环境。

Java虚拟机(二):垃圾回收算法的更多相关文章

  1. 深入理解java虚拟机(二)-----垃圾回收

    做一个java程序员很是幸福,不用管不用的对象如何被回收,但是我认为了解一下也不是坏事. 一.如何判断对象已经死亡? 在进行垃圾回收之前,第一件事肯定是判断对象是否已经死亡.1.引用计数算法给对象添加 ...

  2. 深入理解java虚拟机【垃圾回收算法】

    Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...

  3. Java虚拟机之垃圾回收算法思想总结

    1.引用计数法 这是个比较古老而经典的垃圾回收算法,其核心就是在对象被其他所引用的时候计数器加1,而当引用失去时减1.这个方法有非常严重的问题:无法此话有理循环引用的情况,还有就是每次进行加减操作比较 ...

  4. java虚拟机之垃圾回收算法

    标记-清除算法: 这是最基础的,就是之前所讲的两次标记,首先标记出所有 需要回收的对象,然后进行统一清除, 这有两缺点:一是效率低,标记和清除(开启低优先级进行回收)都是低效率的.第二是空间问题,标记 ...

  5. 每日一问:讲讲 Java 虚拟机的垃圾回收

    昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...

  6. Java虚拟机之垃圾回收详解一

    Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...

  7. JVM学习总结二——垃圾回收算法

    昨天总结了JVM内存分区相关的知识,这次我们将来了解下JVM的另一个核心知识点——垃圾回收算法.这一部分其实并不太难,如果对操作系统的内存处理算法有所了解,那么这部分算法其实只看名字就能明白,两者在原 ...

  8. java虚拟机 之 垃圾回收机制

    一.如何判断对象已死 垃圾回收器并不是java独有的,垃圾回收器的作用就是回收对象释放内存空间,那么如何判断哪些对象应该被回收呢? 在Java语言中是采用GC Roots来解决这个问题.如果一个对象和 ...

  9. Java中的垃圾回收算法详解

    一.前言   前段时间大致看了一下<深入理解Java虚拟机>这本书,对相关的基础知识有了一定的了解,准备写一写JVM的系列博客,这是第二篇.这篇博客就来谈一谈JVM中使用到的垃圾回收算法. ...

  10. JVM虚拟机和垃圾回收算法

    类加载机制 双亲委派模型 垃圾回收算法 CMS G1 类加载机制 双亲委派模型 双亲委派模型: 需要加载一个类,先委托父类加载,父类找父类,依次递归加载;加载不到再由自己加载 垃圾回收算法 JVM的内 ...

随机推荐

  1. Android 画廊效果之ViewPager显示多个图片

    首先来看下面的效果: 从上面的图片可以看到,当添加多张图片的时候,能够在下方形成一个画廊的效果,我们左右拉动图片来看我们添加进去的图片,效果是不是好了很多呢?下面来看看怎么实现吧! 上面的效果类似An ...

  2. golang实现图片上传

    golang实现图片上传 该代码为使用beego实现前后端图片上传.话不多说,直接上代码. 1.前端代码 html代码: <div class="col-5 f-l text text ...

  3. GO语言打包ICO图标

    1. go get github.com/akavel/rsrc2. 创建manifest文件, 命名:main.exe.manifest : <?xml version="1.0&q ...

  4. LINUX系统yum安装SVN服务及其配置

    待: http://oplinux.com/app/svn/linux-yum-install-svn.html  //基础设置及流程 http://files.cnblogs.com/logon/s ...

  5. CentOS7 配置光盘iso镜像为本地yum源

    因为系统使用的最小化安装,所以很多软件没有安装上,又无法上网,为了方便,所以直接将上传的iso镜像直接作为yum源. 我已经将光盘的iso镜像上传至服务器. 接下来就是将iso的光盘镜像进行挂载了 m ...

  6. c# 统计运行时间

    long startTime = Environment.TickCount; long endTime = Environment.TickCount; long totalTime = endTi ...

  7. openfaas 私有镜像配置

    备注: 此项目是使用nodejs  生成唯一id 的\ 预备环境 docker harbor faas-cli openfaas k8s 1. 项目初始化 faas-cli new node --la ...

  8. SMMS 2016 啟用深色主題

    1.用文本類編輯器 打開C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\ManagementStudio目錄下的 ssms.pkg ...

  9. mybatis排序

    排序的时候#和$的分别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by ...

  10. 记一次RESTful调试过程

    1. 为什么前台怎么调用后台,都是跳到页面不存在. 因为已经改为RESTful,保存按钮的type还是submit: 2. 改成buttong之后,设置onclick="update()“, ...