简述

因为各个平台的虚拟机的垃圾收集器的实现各有不同,所以只介绍几个常见的垃圾收集算法。

JVM中常见的垃圾收集算法有以下四种:

标记-清除算法(Mark-Sweep)。

复制算法(Copying)。

标记整理算法(Mark-Compact)。

分代收集算法(Generational Collecting)。

标记-清除算法

标记-清除算法是现代垃圾回收算法的思想基础,主要分为两个阶段:标记阶段和清除阶段。首先根据可达分析算法,标记处可以回收的对象,标记完成后,进行清除阶段,将标记为可回收的对象进行清除。这个算法有两个弱点,一个弱点是效率问题,标记和清除效率都不高,另一弱点,也是最大的弱点就是会产生空间碎片。当内存中空间碎片过多时,在创建较大的对象过程中,无法分配出足够的联系内存空间,会不得以的出发一次垃圾回收动作。

标记-清除算法执行过程如下图所示:

复制算法

与标记-清除算法相比,复制算法是一种相对效率高的回收算法,它的核心思想是:将原有的内存空间划分为大小相等的两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活的对象复制到未使用的的内存块中,然后清除正在使用的内存块,然后交换两个内存的角色(即使用块变成未使用块,未使用块变成使用块)。复制算法可以保证回收后没有空间碎片。但是复制算法的弱点是将系统可用内存折半,这个代价有些太大。

执行过程如下:

在JVM的新生代(堆内存分为新生代老年代)中就是使用的这种收集算法,在新生代中大部分对象都是“朝生夕死”,所以复制算法也不是非要按照对半平分内存,而是分为较大的一个Eden空间和两个较小的Survivor空间(from和to),每次进行新生代回收时会将Eden区from Survivor区还存活着的对象复制到to Survivor区,然后清理掉Eden区和from Survivor区的可回收对象,如果to Survivor区中没有足够的空间来接受还存活着的对象,则会把多余的对象放到老年代区。这种改进的(非平分内存)复制算法,既保证了空间的连续性,又避免了大量的内存空间的浪费。

复制算法适用于新生代,是因为在新生代中,垃圾对象通常多于存活对象,这中情况适用复制算法效果会比较好。

标记整理算法

复制算法的高效性,是因为新生代的存活对象多,垃圾对象少。但是在老年代中,常见的情况下大部分都是存活对象,如果依然只用复制算法,效率就会大大折扣。因为存活对象太多,复制的成本太高了。

基于老年代的特点,产生了一种标记整理算法,标记整理算法也是分两个阶段,标记阶段整理阶段,标记阶段也是先标记出存活的对象,在整理阶段是将存活的对象都向内存的一端进行压缩移动,然后清理掉端边界以外的空间。

标记整理算法执行过程如下:

这种算法既避免了产生空间碎片,又不需要将内存平分,因此效率还是可以的。

分代收集算法

当前的商业虚拟机都采用“分代收集算法”,其主要思想是:根据垃圾回收对象的特性,使用合适的算法进行回收。基于这种思想,分代算法将堆内存分为特点鲜明的几块,根据每块的特点,选择适用的收集算法,进而提高回收效率。

在新生代时使用复制算法,在老年代时使用标记压缩算法。

这种分代算法在HotSpot虚拟机上使用,几乎所有的垃圾回收器都区分新生代和老年代。

JVM学习记录-垃圾回收算法的更多相关文章

  1. JVM学习--(四)垃圾回收算法

    我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...

  2. JVM学习笔记——垃圾回收篇

    JVM学习笔记--垃圾回收篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的垃圾回收部分 我们会分为以下几部分进行介绍: 判断垃圾回收对象 垃圾回收算法 分代垃圾回收 垃圾回收器 ...

  3. @JVM新一代的垃圾回收算法

    垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对实时性要 ...

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

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

  5. JVM中的垃圾回收算法GC

    GC是分代收集算法:因为Young区,需要回收垃圾对象的次数操作频繁:Old区次数上较少收集:基本不动Perm区.每个区特点不一样,所以就没有通用的最好算法,只有合适的算法. GC的4大算法 1.引用 ...

  6. 【JVM】JVM中的垃圾回收算法

    1.标记 -清除算法 "标记-清除"(Mark-Sweep)算法,如它的名字一样,算法分为"标记"和"清除"两个阶段:首先标记出所有需要回收 ...

  7. 谈谈JVM垃圾回收机制及垃圾回收算法

    一.垃圾回收机制的意义 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理.由于有个垃圾回收机制 ...

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

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

  9. jvm学习笔记一(垃圾回收算法)

    一:垃圾回收机制的原因 java中,当没有对象引用指向原先分配给某个对象的内存时候,该内存就成为了垃圾.JVM的一个系统级线程会自动释放该内存块.垃圾回收意味着程序不再需要的对象是"无用信息 ...

随机推荐

  1. OpenCV提取显示一张图片(或者视频)的R,G,B颜色分量

    使用OpenCV可以提分别提取显示一张图片(或者视频)的R,G,B颜色分量.效果如下. 原图: R: G: B: 示例代码如下,貌似很久以前网上找的的,逻辑很清晰,就是把R,G,B三个分量分开,然后显 ...

  2. 在Windows下搭建Gitlab服务器

    一.GitLab简介 GitLab 是一个用于仓库管理系统的开源项目.使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 可通过Web界面进行访问公开的或者私人项目.它拥有与Github类 ...

  3. BAT Android工程师面试流程解析+还原最真实最完整的一线公司面试题

    尊重原创,转载请写明原文出处:http://blog.csdn.net/sk719887916/article/details/47040931 (skay) 求职和我们每个人息息相关,而求职也有门道 ...

  4. Java进阶(二十)解疑答惑之何时字符串才算真正为空?

    解疑答惑之何时字符串才算真正为空? 在一次编码过程中,有一个现象一直困扰着自己,经过后台的不断调试,才发现原来有时候字符串的空非空.测试代码如下: // medname可为药品名称或药品ID Stri ...

  5. 内存数据网格hazelcast的一些机制原理

    hazelcast作为一个内存数据网格工具,还算比较优秀,听说有Apache顶级项目使用它,值得研究下,使用文档可以直接看官方文档,但机制原理相关的资料基本没有,本人硬撸源码写的一些东西,跟大家分享一 ...

  6. 【Coding算法导论】第4章:最大子数组问题

    Coding算法导论 本系列文章主要针对算法导论一书上的算法,将书中的伪代码用C++实现 代码未经过大量数据测试,如有问题,希望能在回复中指出! (一)问题描述 给定一个数组,求数组中连续的子数组的和 ...

  7. 【LaTeX排版】LaTeX使用--入门基础<一>

    经过两个多星期,毕业论文终于写完了.由于自己对Word软件并不是很熟悉,再加上在数模时见识过LaTex的强大之处,于是就决定用LaTex进行论文的排版.使用LaTex可以避免像Word那样换台机器而出 ...

  8. Gibbs sampling

    In statistics and in statistical physics, Gibbs sampling or a Gibbs sampler is aMarkov chain Monte C ...

  9. Linux常用命令(第二版) --文件管理命令

    文件管理命令 并不建议:照着像命令大全这类的书来学! 常用命令大约有200个. 文件命名规则: a)除了'/'之外所有字符都合法! b)这些字符最好不用 1.空格符,制表符,退格符 2.连接符 3.特 ...

  10. ERP-非财务人员的财务培训教(二)------如何评价公司/部门经营业绩

    一.财务比率分析 第一节  流动性比率 第二节  经营比率 第三节  资本结构比率 第四节  获利能力比率 第五节  现金流量比率 第六节  获现能力比率 二.财务比率金字塔 第二部分   如何评价公 ...