JVM学习记录2--垃圾回收算法
首先要明确,垃圾回收管理jvm的堆内存,方法区是堆内存的一部分,所以也是。
而本地方法栈,虚拟机栈,程序计数器随着线程开始而产生,线程的结束而消亡,是不需要垃圾回收的。
1. 判断对象是否可以被回收
1.1 引用计数法
- 原理:给对象添加一个计数标志,被引用一次就加1,引用取消就减1,而垃圾回收时只需要回收计数值为0的即可。
- 优点:快,简单
- 缺点:无法解决循环引用,如A引用B,B引用A,然后A,B的计数值都是1,但实际上A,B都应该被回收。
1.2 根搜索算法
- 原理:通过一系列名为“GC Roots”的对象做为起点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链(用图论就是对象到GC Roots不可达),则说明对象不可用,可以回收。
- 优点:简单,暴力
- 缺点:对对象的描述只存在“引用”,“无引用”两种,太过纯粹,狭隘。我们希望当内存足够时,可以将一些“缓存”对象也保存在内存,当内存不足时在回收。
java 中引用类型分为4类。
强引用:只有引用关系在,垃圾回收器就不会回收。
软引用:引用关系在,内存足够时,不回收。内存不足时,回收。SoftReference类
弱引用:引用关系在,内存不管够不够,发生gc,必被回收。WeakReference
虚引用:不影响对象的行为,仅为对象被收集器回收时,收到一个系统通知。PhantomReference
2.垃圾回收算法
2.1 标记-清除算法(Mark-Sweep)
标记-清除算法是最基础的收集算法,分为两步。先是“标记”,这个过程就是判断对象是否可以被回收,具体方法就是引用计数法或根搜索算法。其次是“清除”。过程如下:

这种算法有两个缺点:一个是效率问题,标记和清除的过程效率不高;一个是空间问题,这种算法产生了很多不连续的内存碎片,当后续分配大对象时,会因为空间不足而多次触发回收,效率更加低下了。
2.2 复制算法(copying)
为了解决效率问题,复制算法将内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块内存用完了,就将存活的对象复制到另一块上面,然后将已使用的内存空间一次清理掉。这样就不需要考虑内存碎片问题了,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。但代价就是讲内存缩小了一半。过程如下:

现在的商业虚拟机都采用这种算法来回收新生代,IBM的专门研究表明,新生代中的对象98%是朝生夕死,所以并不需要安装1:1的比例来划分内存空间。而是将内存分为一个较大的eden区,两个survivor区。当回收,就eden和其中一个survivor区中存活对象一次性地拷贝到另一个survivor区。一般默认的大小比例为8:1。当然,假如survivor区大小不足的话,是需要依赖其它内存的(老生代)进行分配担保(Handle Promotion)。
2.3 标记-整理算法(Mark-Compact)
这个算法同样分为两步,首先是“标记”,这个标记-清除算法的“标记”一样,但后续的“整理”不是对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界以为的内存。过程如下:

2.4 分代算法
当前商业虚拟机的垃圾收集都采用了“分代算法”,这种算法并不是新的思想,只是根据对象的存活周期的不同将内存划分为几块。一般是把java堆分为新生代和老生代,这样就可以根据每个区域的特点,采用最适当的收集算法。比如,在新生代采用复制算法(copying)。老生代采用标记-清除算法或者标记-整理算法。
本文借鉴
JVM学习记录2--垃圾回收算法的更多相关文章
- JVM学习(三):垃圾回收算法
局部性原理和分代回收思想 大学学习操作系统或者计算机组成原理的时候都提到一个重要概念,叫局部性原理. 局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小 ...
- JVM学习总结二——垃圾回收算法
昨天总结了JVM内存分区相关的知识,这次我们将来了解下JVM的另一个核心知识点——垃圾回收算法.这一部分其实并不太难,如果对操作系统的内存处理算法有所了解,那么这部分算法其实只看名字就能明白,两者在原 ...
- JVM虚拟机学习一:垃圾回收算法总结
1.java虚拟机中涉及到的数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某 ...
- JVM内存模型,垃圾回收算法
JVM内存模型总体架构图 程序计数器多线程时,当线程数超过CPU数量或CPU内核数量,线程之间就要根据时间片轮询抢夺CPU时间资源.因此每个线程有要有一个独立的程序计数器,记录下一条要运行的指令.线程 ...
- JVM内存模型及垃圾回收算法
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- 轻松学JVM(四)——垃圾回收算法
我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...
- 深入理解JVM(四)——垃圾回收算法
我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...
- 直通BAT必考题系列:JVM的4种垃圾回收算法、垃圾回收机制与总结
垃圾回收算法 1.标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段. 在标记阶段首先通过根节点(GC Roots),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象. ...
- 小师妹学JVM之:GC的垃圾回收算法
目录 简介 对象的生命周期 垃圾回收算法 Mark and sweep Concurrent mark sweep (CMS) Serial garbage collection Parallel g ...
随机推荐
- 首次接触flask遇到socket.error: [Errno 10013] 报错
解决方案: 发现是因为端口5000被占用了,设置一个其他port就行:app.run(port=5050)
- 品Spring:负责bean定义注册的两个“排头兵”
别看Spring现在玩的这么花,其实它的“筹码”就两个,“容器”和“bean定义”. 只有先把bean定义注册到容器里,后续的一切可能才有可能成为可能. 所以在进阶的路上如果要想走的顺畅些,彻底搞清楚 ...
- Knative 实战:基于 Knative Serverless 技术实现天气服务-上篇
提到天气预报服务,我们第一反应是很简单的一个服务啊,目前网上有大把的天气预报 API 可以直接使用,有必要去使用 Knative 搞一套吗?杀鸡用牛刀?先不要着急,我们先看一下实际的几个场景需求: 场 ...
- Spring boot 梳理 - SpringBoot中注入ApplicationContext对象的三种方式
直接注入(Autowired) @Configuration public class OAConfig { @Autowired private ApplicationContext applica ...
- 非对称加密openssl协议在php7实践
据网上资料,RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商务中RSA被广泛使用.RSA是1977年由罗纳德·李维斯特(RON RIVEST).阿迪·萨莫尔(ADI SHAMIR)和伦纳德· ...
- 通过实例快速掌握k8s(Kubernetes)核心概念
容器技术是微服务技术的核心技术之一,并随着微服务的流行而迅速成为主流.Docker是容器技术的先驱和奠基者,它出现之后迅速占领市场,几乎成了容器的代名词.但它在开始的时候并没有很好地解决容器的集群问题 ...
- 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU特性那些事(5)- 划时代新品RT1170
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列MCU的划时代新品i.MXRT1170. 自2017年开始,每年的6月25日恩智浦都会在北京举行微控制 ...
- linux 装composer的出现的问题
curl -sS https://getcomposer.org/installer | php php 值得是php的liux下的安装目录 php环境变量 当装compser 的时候,出现 ...
- opencv之形态变换
形态变换 在opencv之膨胀与腐蚀中介绍了Dilation/Erosion的原理.建议先读这一篇,搞懂原理. 这样就可以很轻松地理解为什么本文的这些形态变换可以取得相应的效果. 基于此,我们可以组合 ...
- 转:python2.x 和 python3.x的区别
注:本文的原文地址为Key differences between Python 2.7.x and Python 3.x 许多 Python 初学者想知道他们应该从 Python 的哪个版本开始学习 ...