【JVM】jvm垃圾回收器相关垃圾回收算法
引用计数法
【原理】
--->引用计数器是经典的也是最古老的垃圾收集防范。
--->实现原理:对于对象A,只要有任何一个对象引用A,则计数器加1.当引用失效时,计数器减1.只要对象A的计数器值为0时,则A的为垃圾。
--->引用计数器法存在两个缺陷:
(1)无法处理循环引用的情况。A中引用B,B中引用A。无第三方对象引用A和B。则A和B为垃圾,但A和B的计数器不为0.
(2)引用计数器要求在每次因引用产生和消除的时候,需要伴随一个加法操作和减法操作,对系统性能会有一定的影响。
--->java虚拟机并没有采用这样的垃圾回收算法
【名词解释】
可达对象--->指通过根对象进行引用搜索,最终可以达到的对象。
不可达对象--->通过根对象进行引用搜索,最终没有被引用到的对象。

标记清除算法
--->在标记阶段,通过根节点,标记所有从根节点开始的可达对象。未被标记的就是垃圾对象可以被回收。
--->标记清除算法可能产生的最大问题是空间碎片。
--->回收后的空间是不连续的。在对象的堆空间分配过程中,尤其是大对象内存分配,不连续的内存空间的工作效率要低于连续的空间。
--->可作为GCroot的对象:
(1)虚拟机栈(栈帧中的本地变量表)中引用的对象
(2)方法区中类静态属性引用的对象
(3)方法区中常量引用的对象
(4)本地方法栈中(一般指Native方法)引用的对象

复制算法
【原理】
--->核心思想:将原有的内存空间分为两块,每次只使用一块。
--->在垃圾回收时,将正在使用中的内存中存活的对象复制到未使用的内存块中,之后,清除正在使用的内存块中所有的对象,交换两个内存的角色,完成垃圾回收。
--->在java新生代串行垃圾回收器中,使用了复制算法的思想。新生代分为eden空间,from空间和to空间三部分。其中from和to空间可视为用于复制的两块大小相同,地位相等,且可进行角色互换的空间块。from和to空间也称为survivor空间,即幸存者空间,用于存放未被回收的对象。
--->复制算法比较适用于新生代。因为在新生代,垃圾对象通常会多于存活对象。复制算法效果会比较好。
【名词解释】
新生代--->存放年轻对象的空间。年轻对象指刚刚创建的,或者经历垃圾回收次数不多的对象。
老年代--->存放老年对象的空间。老年对象指经历过多次垃圾回收依然存活的对象。

标记压缩法
--->复制算法的高效性,建立在存活对象少,垃圾对象多的前提下。这种情况在新生代经常发生。但是在老年代,更常见的情况是大部分对象都是存活对象。如果依然使用复制算法,由于存活的对象多,复制成本高。因此,基于老年代垃圾回收的特性,需要使用其他算法。
--->标记压缩法是一种老年代的回收算法。他在标记清除的算法基础上做了一些优化。和标记清除算法一样,标记压缩算法也首先需要从根结点开始,对所有可达对象做一次标记。但之后,它并不只是简单地清理未被标记的对象,而是将所有存活对象压缩到内存的一端,之后,清理边界外所有的空间。这样避免产生不连续内存碎片,又不需要两块相同的内存空间。
--->标记压缩法等同于标记清除算法执行完后,在进行一次内存碎片整理。

分代算法
--->分代算法,是将内存按对象的存活周期划分为新生代和老年代。从而进行回收。于之相对应的还有分区算法。
--->前文介绍了复制,标记清除,标记压缩等垃圾回收的算法。在所有这些算法中,并没有一种算法可以完全替代其他算法,他们都具有自己独特的优势和特点。因此根据垃圾回收对象的特性,使用合适的算法回收,才是明智的选择
--->一般来说,新生代的内存区,对象朝生夕死,90%的新建对象都会立马变成垃圾对象。也就是说,存活对象远远小于垃圾对象,比较适合使用复制算法。效率性能高。
--->而老年代内存区,对象的存活率几乎可达100%,如果依然使用复制算法,则需要对折内存外,还需要复制大量存活对象,而且都是大对象。效率性能低下,而且大大折扣了内存空间。因此使用标记压缩法比较合适。
--->新生代回收频率高,时间短。老年代回收频率低,时间长。但有的新生代对象,会因为占的内存大,直接进入老年代区域。每次新生代GC时,势必需要扫描老年代。这样时间就会被拖长。因此,对老年代的所有对象,有一个卡表的数据结构。相当于标记老年代内存区域所存放的对象是否是从新生代过来的。卡表(card table)数据结构,为一个比特位集合。
--->每一个比特位用来表示老年代的某一个区域中所有对象是否持有新生代对象的引用。这样在新生代GC时,不需要花大量的时间扫描老年代的对象,来确定每一个对象的引用关系。而可以先扫描卡表标记位为1的老年代区域,进行新生代完整GC。大大加快了新生代的GC
分区算法
--->一般来说,在相同条件下,堆空间越大,一次GC的时间就越长。从而产生的停顿时间也越长。
--->因此可以将内存区域进行划分为多个区域,每一个小区域,都独立使用,独立进行GC。这样可以控制一次GC回收多少个内存小区域。这样就可以更好控制GC带来的停顿时间。
【JVM】jvm垃圾回收器相关垃圾回收算法的更多相关文章
- (5)jvm垃圾回收器相关垃圾回收算法
引用计数法[原理]--->引用计数器是经典的也是最古老的垃圾收集防范.--->实现原理:对于对象A,只要有任何一个对象引用A,则计数器加1.当引用失效时,计数器减1.只要对象A的计数器值为 ...
- 面试之C#--垃圾回收器什么时候回收?
每个对象只有在该对象不存在任何引用才会被垃圾回收起回收. 可以调用静态方法System.GC.Collect()垃圾回收器,但是不建议这么做: 用using语句可以有效的自动释放掉资源. 实在没有办法 ...
- 【Java面试题】50 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
1.对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址.大小以及使用情况. 通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象.通过这种方式确定哪些对象是"可达的&q ...
- 【转】Java学习---垃圾回收算法与 JVM 垃圾回收器综述
[原文]https://www.toutiao.com/i6593931841462338062/ 垃圾回收算法与 JVM 垃圾回收器综述 我们常说的垃圾回收算法可以分为两部分:对象的查找算法与真正的 ...
- 垃圾回收算法与 JVM 垃圾回收器综述(转)
垃圾回收算法与 JVM 垃圾回收器综述 我们常说的垃圾回收算法可以分为两部分:对象的查找算法与真正的回收方法.不同回收器的实现细节各有不同,但总的来说基本所有的回收器都会关注如下两个方面:找出所有的存 ...
- JVM 专题二十:垃圾回收(四)垃圾回收器 (一)
1. GC分类与性能指标 垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商.不同版本的JVM来实现.由于JDK的版本处于高速迭代过程中,因此Java发展至今已经产生了众多的GC版本.从不同角度分 ...
- 轻松学JVM(四)——垃圾回收算法
我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...
- JVM学习--(四)垃圾回收算法
我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...
- 深入理解JVM(四)——垃圾回收算法
我们都知道java语言与C语言最大的区别就是内存自动回收,那么JVM是怎么控制内存回收的,这篇文章将介绍JVM垃圾回收的几种算法,从而了解内存回收的基本原理. stop the world 在介绍垃圾 ...
随机推荐
- <转载> 为什么在Python里推荐使用多进程而不是多线程?
经常我们会听到老手说:“Python下多线程是鸡肋,推荐使用多进程!”,但是为什么这么说呢? 要知其然,更要知其所以然.所以有了下面的深入研究: 首先强调背景: ...
- FineUIPro中如何支持多语言(全局资源文件和本地资源文件)
一个客户在邮件中问到了FineUIPro的多语言实现问题,其实 FineUIPro 并没有对此做特殊处理,因此直接使用 ASP.NET 原生支持的资源文件就能实现. 下面我们就以FineUIPro的空 ...
- [原创]将本地代码共享到github的操作步骤
将本地代码共享到github的操作步骤 本地代码目录执行如下命令,初始化为git仓库. git init 到github上新建一个仓库,假设为https://github.com/sky0014/sk ...
- 新升级!EasyNVR3.0功能概述--直播与录像
背景介绍: 对于摄像机直播已经是我们司空见惯的需求,但是,许多用户在现有的直播的基础上更有录像的需求,并且有关于录像的删除定时等录像计划的需求,更有客户不仅需要这些功能,还需要将这些功能集成到自身的业 ...
- python基础-第六篇-6.4模块混战
我们之前接触多的编程方式就是函数式编程,而且喜欢就一个文件里写完所有的程序代码,这样做在前期感觉还不错,不过一旦你的程序变复杂,在易读性和排错方面就感觉好吃力,功能界限不明显,那今天我们就来讲讲怎么用 ...
- SM30 表格维护生成器
1)SE11创建自建表,结构如下: 2) 创建表维护 3) 针对上面创建的函数组ZMM_MAT_DESC,做以下增强处理 添加的Module 代码如下: module mod_customize in ...
- zookeeper学习与实战(二)集群部署
上一篇介绍了单机版zookeeper安装,这种情况一般用于开发测试.如果是生产环境建议用分布式集群部署,防止单点故障,增加zookeeper服务的高可用. [环境介绍] 三台机器:192. ...
- 左侧图片 右侧块的实现方法---解决3像素bug的一种解决方案,不用浮动用绝对定位和margin-left
google的实现方式是: <div class="mw"> <a href="/" id="mlogo"> &l ...
- /etc/apt/sources.list
今天学习: 在Ubuntu下软件源的文件是/etc/apt/sources.list,那么sourdces.list.d目录下的文件又是什么作用呢? 该文件夹下的文件是第三方软件的源,可以分别存放不同 ...
- 剑指offer之 二叉搜索树的后续遍历序列
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. public class Solution { ...