深入浅出JVM之垃圾收集算法】的更多相关文章

判断哪些对象需要被回收 引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用的. 但是JVM没有使用此方法,因为此方法无法解决2个对象相互循环引用的问题. 可达性分析算法: 这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象…
  通过前面的介绍我们了解了对象创建和销毁的过程.那么JVM中垃圾收集器具体对对象回收采用的是什么算法呢?本文主要记录下JVM中垃圾收集的几种算法. JVM的垃圾回收的算法 标记-清除算法(Mark-Sweep)   标记清除算法是最基础的回收算法,该算法分为两个阶段,即标记阶段和清除阶段. |阶段|说明 | |--|:--| | 标记阶段|先根据可达性分析算法找出需要回收的对象进行标记 | | 清除阶段| 统一回收被标记的对象| 参考<深入理解java虚拟机>: 从可达性分析算法角度看标记-…
1. 一些概念 1.1 垃圾&垃圾收集 垃圾:在 JVM 语境下,"垃圾"指的是死亡的对象所占据的堆空间. 垃圾收集:所谓"垃圾收集",就是将已分配出去.但不再使用的内存回收回来,以便能再次分配. 1.2 对象是否死亡 如何判断一个对象是否死亡(即不可能再被任何途径使用)?通常有以下两种方法: 1.2.1 引用计数法 引用计数法(Reference Counting):为每个对象添加一个引用计数器,用来统计指向该对象的引用个数.当有地方引用它时,计数器加一:…
一. 概述 说起垃圾收集(Garbage Collection, GC), 大部分人都把这项技术当做Java语言的伴随生产物. 事实上, GC的历史远远比Java久远, 1960年 诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言. 当Lisp还在胚胎时期时,人们就在思考GC需要完成的三件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 现在内存的动态分配与内存回收技术已经相当成熟, 那为什么我们还要去了解GC和内存分配呢? 答案很简单: 当需要排查各种内存溢出, 内…
垃圾收集是java语言的亮点,大大提高了开发人员的效率. 垃圾收集即GC,当内存不足的时候触发,不同的jvm版本算法和机制都有差别. 我是李福春,我在准备面试,今天的问题是: jvm的垃圾回收算法有哪些?有哪些垃圾收集器? 答:jvm的垃圾回收首先需要标注出可回收的对象,采用的是可达图算法(从对象出发,绘制出出对象的引用关系图, 当从活动对象出发,在图中不可达的对象即可标注为可回收对象) jvm的垃圾回收算法有3种,列举如下: 1, 标记清除算法.(即把标注的可回收对象直接清理,这样会带来内存碎…
前言 总所周知,jvm的垃圾收集算法一般包括标记.清除.整理三个阶段,最近在看了有关于垃圾收集的标记算法,记录一下自己的理解. 垃圾收集中标记算法有两种:一种是引用计数法,一种是根搜索算法. 引用记数法 引用计数法非常容易理解,jvm为每一个对象设立一个引用计数器,当该对象被引用时,计数器就加一,引用取消时则减一. 当jvm开始gc时,jvm判断该对象的引用计数器是否为0,若为0则标记为可清除对象. 引用计数器有个致命的缺点是无法解决循环依赖问题,这也导致这个算法被弃用. 如下图所示,当对象A中…
1. 垃圾收集算法       JVM的垃圾收集算法在不同的JVM实现中有所不同,且在平时工作中一般不会深入到收集算法,因此只对算法做较为简单的介绍.       1.1 标记-清除算法           这种算法是非常直观的,也是最为基础的收集算法(Mark-Sweep)算法,这种算法将回收分为两个阶段:首先标记所有需要回收的对象,然后在完成标记后统一回收掉被标记的对象.这种算法是如此的基础,以至于后面的算法都是基于该思路,并对其确定进行改进所得的.           这种算法的缺点主要有…
 [JVM垃圾收集算法] 1)标记-清除算法: 标记阶段:先通过根节点,标记所有从根节点开始的对象,未被标记的为垃圾对象(错了吧?) 清除阶段:清除所有未被标记的对象 2)复制算法: 将原有的内存空间分为两块,每次只使用一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未被使用的内存块中,然后清除正在使用的内存块中的所有对象. 3)标记-整理算法: 标记阶段:先通过根节点,标记所有从根节点开始的可达对象,未被标记的为垃圾对象 整理阶段:将所有的存活对象压缩到内存的一段,之后清理边界所有的空间…
JVM垃圾收集 1. 判断对象是否存活 引用计数算法 对象添加一个引用计数器,每个地方引用它,计数器值加+1:当引用失效,计算器值减1:任何时刻计数器为0的对象不可能被使用.引用计数算法实现简单,高效. 缺点:引用计数算法,很难解决相互引用的问题. objA.instance = B; objB.instance = C; 可达性分析算法 主流商用算法,通过一些列的"GC roots" 作为对象的起点,从这些节点开始向下搜索,锁走过的路径成为引用链(reference Chain),当…
JVM垃圾收集算法的具体实现有很多种,本文只是介绍实现这些垃圾收集算法的三种思想和发展过程.所有的垃圾收集算法的具体实现都是遵循这三种算法思想而实现的. 1.标记-清除算法 标记-清除(Mark-Sweep)算法是最基础的垃圾收集算法.正如其名字描述的那样,该算法分为两个阶段:"标记"和"清除".首先标记出所有可以被回收的对象,然后经过一轮垃圾回收将所有被标记的对象的内存空间释放,即清除可被回收的对象.标记-清除算法的执行过程如下图所示: 该算法的优点是逻辑简单,最…
标记-清除算法 此垃圾收集算法分为“标记”和“清除”两个阶段: 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记对象,它的标记过程前面已经说过——如何判断对象是否存活/死去 死去的对象就会被标记,然后被清除. 它主要有两点不足: 一个是效率问题,标记和清除两个过程的效率都不高: 另一个是空间问题,标记清除之后会产生大量不连续的空间碎片,空间碎片太多可能会导致以后再程序运行过程中需要分配较大对象时, 无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作. 标记-清除算法的执行过程如…
Java 常见的垃圾收集器有哪些 实际上,垃圾收集器(GC,Garbage Collector)是和具体 JVM 实现紧密相关的,不同厂商(IBM.Oracle),不同版本的JVM,提供的选择也不同.接下来,我来谈谈最主流的 Oracle JDK. Serial GC 它是最古老的垃圾收集器,"Serial"体现在其收集工作是单线程的,并且在进 行垃圾收集过程中,会进入臭名昭著的"Stop-The-World"状态.当然,其单线程设计也意味着精简的 GC 实现,无需…
 系列介绍|本系列主要是记录学习jvm过程中觉得重要的内容,方便以后复习 在说垃圾收集算法之前,先要说一下垃圾收集,从大的讲,垃圾收集需要考虑三件事情: 1.哪些内存需要回收 2.什么时候回收 3.如何回收 JVM在执行java程序时,把他管理的内存分为多个数据区域: 1.程序计数器(记录程序执行到哪了,各线程之间独立存储, 互不影响) 2.虚拟机栈(这个栈就是我们常说的jvm的“堆”和“栈”中的栈,这里存放的是编译期间可知的各种数据类型(8种基本类型).对象引用(reference类型,就是一…
1 JVM 简单结构图   1.1 类加载子系统与方法区 类加载子系统负责从文件系统或者网络中加载 Class 信息,加载的类信息存放于一块称 为方法区的内存空间.除了类的信息外,方法区中可能还会存放运行时常量池信息,包括字符串字面量和数字常量(这部分常量信息是 Class 文件中常量池部分的内存映射). 1.2 Java 堆 java 堆在虚拟机启动的时候建立,它是 java 程序最主要的内存工作区域.几乎所有的 java 对象实例都存放在 java 堆中.堆空间是所有线程共享的,这是一块与…
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 垃圾收集算法 垃圾收集算法主要有标记-清除算法.复制算法.标记-整理算法.分代收集算法这几种,对算法的具体实现不做过多探究,只对他们的设计思想进行介绍. 标记-清除算法 最基础的算法就是标记-清除(Mark-Sweep)算法,同它的名字一样,分为"标记"和"清除"两个阶段:首先标记出所有待回收的对象,标记完后统一回收所有被标记的对象.标记过程其实就是上一…
一.在JVM中什么是垃圾?如何判断一个对象是否可被回收?哪些对象可以作为GC Roots的根 垃圾就是在内存中已经不再被使用到的空间就是垃圾. 1.引用计数法: 内部使用一个计数器,当有对象被引用+1,没有就-1,但是没有办法解决循环引用的问题,JVM不采用此类回收法 2.枚举根节点可达性分析(GC Root) 它必须是一组活跃的引用 思路:通过一系列名为GC Roots的对象作为起始点,从这个被称为GC Root的对象开始向下进行搜索,如果一个对象达到GC Roots 没有任何的引用链相连时,…
纠结的我,给我的JVM系列终于起了第三个名字,害,我真是太难了.从 JVM 到 每日五分钟,玩转 JVM 再到现在的给产品经理讲 JVM ,虽然内容为王,但是标题可以让更多的人看到我的文章,所以,历经了三个选题,最终定下来了这个. 这个名字的由来,且听我给你慢慢道来,从学习知识的角度上来说,最深入的方法就是把知识讲给别人听,那么为什么我要讲给程序员的天敌--产品经理呢? 那么问题的答案很简单,因为我「老婆」就是一个「产品经理」哈哈哈哈哈哈哈(听说现在流行这样玩? 认识的时候她是 Java 开发来…
本文整理自周志明老师的<深入理解Java虚拟机-JVM高级特性与最佳实践>第3版的第二章和第三章. 加上了一些网上拼拼凑凑的图片,个人认为很多博客复制来复制去,最后的东西都看不懂,所以从书里码了一下知识点,也用作自己记忆. 一.一个命令 上面的结果显示了 jvm 的模式: Client VM(-client),为在客户端环境中减少启动时间而优化: Server VM(-server),为在服务器环境中最大化程序执行速度而设计. 在文件路径:jdk-11.0.7+10\lib 下面可以更改 jv…
当前商业虚拟机的垃圾收集都采用"分代收集"算法,即根据对象生命周期的不同,将内存划分几块,一般为新生代和老年代,不同的代根据其特点使用最合适的垃圾收集算法 一,标记-清除算法: 该算法分为"标记"."清除"2个过程,首先标记需要清除的对象,然后统一清除 这个算法有2个明显的缺点: 1,标记和清除的效率都不高 2,垃圾收集后,内存碎片化严重 二,复制算法: 将内存分大小相同的2块,每次只使用其中的一块.当一块中的内存耗光,则将还活着的对象复制到另一…
 Java虚拟机学习总结文件夹 垃圾收集算法 垃圾收集算法的实现涉及大量的程序细节,并且各个平台的虚拟机操作内存的方法又各不同样,介绍几种垃圾收集算法的思想及其发展过程. 标记-清除算法 垃圾收集分为"标记"和"清除"两个阶段:首先标记全部须要回收的对象.在标记完毕后统一回收全部被标记的对象.说它是最基础的收集算法.其它收集算法都是基于这样的思路并对其不足进行改进而得到的.它的主要不足有两个: 效率问题,标记和消除两个过程的效率都不高: 空间问题,标记清除之后会…
1.垃圾收集概念 GC目的 分配内存,为每个新建的对象分配空间 确保还在使用的对象的内存一直还在,不能把有用的空间当垃圾回收了 释放不再使用的对象所占用的空间 我们把还被引用的对象称为活的,把不再被引用的对象认为是死的,也就是我们说的垃圾.GC 的工作就是找到死的对象,释放(也称为回收)这些对象所使用的空间的过程称为垃圾收集. 我们把 GC 管理的内存称为 堆(heap),垃圾收集启动的时机取决于各个垃圾收集器,通常,垃圾收集发生于整个堆或堆的部分已经被使用光了,或者使用的空间达到了某个百分比阈…
前言 从如何判定对象消亡的角度出发,垃圾收集算法可以划分为"引用计数式垃圾收集"(Reference Counting GC)和"追踪式垃圾收集"(Tracing GC)两大类,这两类也常被称作"直接垃圾收集"和"间接垃圾收集".由于束流Java虚拟机中使用 的都是"追踪式垃圾收集",所以后续介绍的垃圾收集算法都是属于追踪式的垃圾收集. 分代式收集理论 当前商业虚拟机的垃圾收集器,大多数都遵循了"…
垃圾收集算法 标记-清除算法 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象. 缺点: 效率问题: 空间问题(标记清除后会产生大量不连续的碎片) 复制算法 它可以将内存分为大小相同的两块,每次使用其中的一块.当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉. 缺点: 消耗内存 标记-整理算法 根据老年代的特点提出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接…
# 前言 在 深入浅出 JVM GC(2) 中,我们介绍了一些 GC 算法,GC 名词,同时也留下了一个问题,就是每个 GC 收集器的具体作用.有哪些 GC 收集器呢? Serial 串行收集器(只适用于堆内存 256M 以下的 JVM ) ParNew 并行收集器(Serial 收集器的多线程版本) Parallel Scavenge (PS 收集器,该收集器以吞吐量为主要目的,是1.8的默认 GC) CMS 收集器(该收集器全称 Concurrent Mark Sweep,是一种关注最短停顿…
# 前言 在 深入浅出 JVM GC(1) 中,限于上篇文章的篇幅,我们留下了一个问题 : 如何回收? 这篇文章将重点讲述这个问题. 在上篇文章中,我们也列出了一些大纲,今天我们就按照那个大纲来逐个讲解.在此,我将大纲复制过来. 垃圾回收算法 标记清除算法 复制算法 标记整理算法 分代收集算法(堆如何分代) 有哪些垃圾收集器 Serial 串行收集器(只适用于堆内存256m 以下的 JVM ) ParNew 并行收集器(Serial 收集器的多线程版本) Parallel Scavenge (P…
众所周知,Java的垃圾回收是不需要程序员去手动操控的,而是由JVM去完成.本文介绍JVM进行垃圾回收的各种算法. 1. 如何确定某个对象是垃圾 1.1. 引用计数法 1.2. 可达性分析 2. 典型的垃圾回收算法 2.1. 标记-清除算法(Mark-Sweep) 2.2. 复制算法(Copying) 2.3. 标记-整理算法(Mark-Compact) 2.4. 分代收集算法(Generational Collection) 3. 典型的垃圾收集器 3.1. Serial/Serial Old…
前一篇讲了垃圾收集算法--JVM之GC算法.垃圾收集算法——标记-清除算法.复制算法.标记-整理算法.分代收集算法,如果把它看作是方法论,那么下面说的就应该是内存回收的具体实现. 先看一下JVM中有哪些垃圾收集器,如下图所示: 上图一共展示了七种作用于不同分代的垃圾收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用. 1.Serial 收集器 JDK1.3之前作为新生代收集器的唯一选择.它是单线程收集器,这里的单线程不仅仅说明它只会使用一个CPU和一条收集线程去完成垃圾收集工作, 更重要…
1.垃圾收集对象 垃圾收集主要是针对堆和方法区进行. 程序计数器.虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收. 哪些内存需要回收? 死亡的对象-->对象存活判定算法(引用计数.可达性分析.finalize()方法). 什么时候回收? 垃圾收集算法. 如何回收? 垃圾收集器. 1.1.堆中对象存活判定算法 1. 引用计数算法 给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1.引用…
本文主要是对<深入理解java虚拟机 第二版>第三章部分做的总结,文章中大部分内容都来自这章内容,也是博客 JVM 学习的第二部分. 简述 说到垃圾收集(Garbage Collection,GC),很多人可能会认为这是 Java 自有的特性,曾经我也一度这样想,后来才知道 GC 的历史要远远长于 Java,它第一次真正使用是在 Lisp 中,现在,像 python.go 等都有自己的垃圾收集器.在 GC 最开始设计时,人们在思考 GC 时就需要完成三件事情: 哪些内存需要进行回收? 什么时候…
JVM垃圾回收算法解析 标记-清除算法 该算法为最基础的算法.它分为标记和清除两个阶段,首先标记出需要回收的对象,在标记结束后,统一回收.该算法存在两个问题:一是效率问题,标记和清除过程效率都不太高,二是空间问题,在执行一次清除操作后,会存在好多不连续的内存碎片,从而造成资源的浪费.空间碎片太多将会导致,当在程序运行过程中,需要分配较大对象的时候无法找到足够的连续内存将会导致下一次垃圾收集操作. 复制算法 该算法是在标记-清除算法的基础上出现的,它主要是为了提高效率,它将内存区域分为两个相等的块…