简述

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

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. PA模块常用表

    SELECT * FROM pa_projects_all; --项目 SELECT * FROM pa_project_types; --项目类型 SELECT * FROM pa_project_ ...

  2. Java对象引用处理机制

    翻译人员: 铁锚 翻译时间: 2013年11月13日 原文链接: How does Java handle aliasing? 什么是Java的引用别名机制 Java的引用别名机制(原文为Aliasi ...

  3. Swift语言学习路线图

  4. python的read() 、readline()、readlines()、xreadlines()

    先来一个小例子: import sys dir= os.path.dirname(os.path.abspath(__file__)) file_path='%s/test.txt'  % dir f ...

  5. 开源摄影机:Axiom Camera

    一般情况下只有软件才有开源这个概念.这会儿发现了个很厉害的开源的产品:开源摄影机. 我还是第一次听说摄影机也可以开源.于是去该产品的官方网站了解了一下相关信息. 官网:http://axiom.ape ...

  6. rpcz VC2010 构建

    rpcz VC2010 构建 rpcz 是应用ZeroMQ和Protobuf开发的RPC. 见: https://github.com/reinferio/rpcz 及 https://code.go ...

  7. linux的string操作(字符串截取,长度计算)

    按指定的字符串截取 1.第一种方法: ${varible##*string} 从左向右截取最后一个string后的字符串 ${varible#*string}从左向右截取第一个string后的字符串 ...

  8. Mapreduce 框架解析

    MapReduce过程解析 一.客户端 Map-Reduce的过程首先是由客户端提交一个任务开始的. public static RunningJob runJob(JobConf job) thro ...

  9. 仿百度壁纸客户端(一)——主框架搭建,自定义Tab+ViewPager+Fragment

    仿百度壁纸客户端(一)--主框架搭建,自定义Tab+ViewPager+Fragment 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment ...

  10. DEVICE_ATTR

    说道sysfs接口,就不得不提到函数宏 DEVICE_ATTR,原型是 #define DEVICE_ATTR(_name, _mode, _show, _store) \ struct device ...