1、标记-清除算法

  标记-清除算法分为 “标记” 和 “清除” 两个步骤:首先标记出所有需要回收的对象,然后在标记完成后统一回收所有被标记的对象,是垃圾收集算法中的最基础的收集算法。

  缺点:一、标记和清除两个步骤效率都不高;二、清除后产生大量不连续的内存空间,空间碎片太多产生可能会导致以后在程序运行过程中需要分配较大的对象时,无法找到足够的连续空间而不得不触发一次垃圾收集动作。

2、复制算法

  复制算法将可用的内存按照容量大小分为大小相等的两块,每次只使用其中的一块,当这一块使用完了之后,就将还存活的对象复制到另一块内存上,然后再把已使用过的内存空间一次性清理掉。

  优点:实现简单,运行效率高;

  缺点:可用内存缩小了一半,代价大;

  现在商业虚拟机都采用这种收集算法来回收新生代,因为根据IBM公司的研究,新生代中的对象98%是 “朝生夕死” 的,所以不需要按照 1:1 的比例来划分内存空间,而是将内存划分为一块较大的Eden空间和两块较小的Survivor空间,每次只使用Eden和其中一个Survivor,当回收时,将Eden和Survivor中还存活的对象一次性复制到另一个Survivor空间。HotSpot虚拟机默认 Eden与Survivor空间的比例是8:1。

3、标记-整理算法

  复制算法在对象存活率较高时需要进行多次复制操作,效率将会变低。更是为了节省内存,根据老年代的特点,出现了 "标记-整理" 算法。

  标记-整理算法分为 “标记” 和 “整理” 两个步骤:首先标记出所有需要回收的对象,然后在标记完成之后让存活的对象都要都向内存的一端移动,最后清理掉端边界以外的内存。

Java虚拟机垃圾收集算法的更多相关文章

  1. 深入理解Java虚拟机 - 垃圾收集算法与垃圾收集器

    1. 垃圾收集算法       JVM的垃圾收集算法在不同的JVM实现中有所不同,且在平时工作中一般不会深入到收集算法,因此只对算法做较为简单的介绍.       1.1 标记-清除算法        ...

  2. 深入理解Java虚拟机-垃圾收集算法

    一.判断对象是否可进行回收 1.引用计数算法 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用的.但是主流的 ...

  3. Java 虚拟机-垃圾收集算法

    本文主要介绍Java虚拟机的垃圾回收算法. 一.概述 二.标记-清除算法 Mark-Sweep.如同名字,该算法分两步: 标记:标记处需要回收的对象 清除:标记完成后统一回收被标记的对象. 缺点: 效 ...

  4. 深入理解java虚拟机【Java虚拟机垃圾收集器】

    Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK ...

  5. (转)《深入理解java虚拟机》学习笔记4——Java虚拟机垃圾收集器

    Java堆内存被划分为新生代和年老代两部分,新生代主要使用复制和标记-清除垃圾回收算法,年老代主要使用标记-整理垃圾回收算法,因此java虚拟中针对新生代和年老代分别提供了多种不同的垃圾收集器,JDK ...

  6. Java虚拟机垃圾收集器与内存分配策略

    Java虚拟机垃圾收集器与内存分配策略 概述 那些内存须要回收,什么时候回收.怎样回收是GC须要完毕的3件事情. 程序计数器.虚拟机栈与本地方法栈这三个区域都是线程私有的,内存的分配与回收都具有确定性 ...

  7. 深入理解Java虚拟机 - 垃圾收集概述

    首先需要澄清的是,垃圾收集(GC)的历史远比Java要久远,当我们意识到手动管理内存所带来的麻烦时,懒惰的天性推动先驱们寻找更为简单.易用.关键是傻瓜式的内存管理技术.GC技术起源于1960年诞生于M ...

  8. Java虚拟机--垃圾收集

    Java虚拟机 1. JVM运行时数据区域 参考书籍:<深入理解Java虚拟机:JVM高级特性与最佳实践,第二版> 资料参考:http://blog.csdn.net/nms312/art ...

  9. 深入理解java虚拟机----->垃圾收集器与内存分配策略(下)

    1.  前言 内存分配与回收策略 JVM堆的结构分析(新生代.老年代.永久代) 对象优先在Eden分配 大对象直接进入老年代 长期存活的对象将进入老年代 动态对象年龄判定 空间分配担保  2.  垃圾 ...

随机推荐

  1. JS教程:从0开始

    一. JS简介 1. JavaScript概述 JavaScript 是世界上最流行的编程语言.这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备. ...

  2. mpvue 小程序开发爬坑汇总

    <!-- 小程序的爬坑记录 --> 1 微信小程序之动态获取元素宽高 var obj=wx.createSelectorQuery(); 2 微信小程序图片自适应 <image cl ...

  3. Redis in .NET Core 入门:(4) LIST和SET

    第1篇:https://www.cnblogs.com/cgzl/p/10294175.html 第2篇 String:https://www.cnblogs.com/cgzl/p/10297565. ...

  4. Hyperledger Fabric、Corda和以太坊对比

     Hyperledger Fabric . Corda 和以太坊的对比 三种不同的框架 我们从 Hyperledger Fabric.R3 Corda和以太坊的白皮书中可以看到,三种框架在可能的应用领 ...

  5. Eclipse4JavaEE安装SpringBoot

    第一步:下载SpringBoot SpringBoot官网下载链接 第二步:在Eclipse里进行安装 打开Eclipse,菜单栏Help ->Install New Software,进入下图 ...

  6. 全新定义!免费开源ERP平台如何玩转工业互联网

    简述 IoT Box通过Wifi.蓝牙.USB.网线等方式连接设备.IoT再通过互联网连接到Odoo服务器 Odoo的各种应用通过IoT操作各种设备.例如,PoS应用通过IoT操作小票打印机.银行刷卡 ...

  7. git相关的操作

    给大家分享下git的使用心得,有不足的请大家补充: 克隆:git clone https://XXXXX 克隆指定分支:git clone -b https://XXXX 添加所有:git add . ...

  8. 深入分析Java I/O 工作机制

    前言 :  I/O 问题是Web 应用中所面临的主要问题之一.而且是任何编程语言都无法回避的问题,是整个人机交互的核心. java 的I/O类操作在java.io 包下,将近80个子类, 大概可以分成 ...

  9. vue项目使用 prerender-spa-plugin 预渲染

    由于项目要做seo优化,而用vue写成的spa页面谷歌浏览器等是抓取不到数据的.介于ssr和预渲染来说,后者相对来说要简单许多.所以采用了预渲染方式.采用插件prerender-spa-plugin使 ...

  10. MonacoEditor 主动触发代码提示功能

    MonacoEditor是微软提供的代码编辑器 vscode即是使用它作为编辑器. 它的开发语言是ts,可以嵌入到浏览器中. 代码提示或者说代码补全功能是我们经常需要定制的部分. 目前它提供的快捷键是 ...