JVM GC之垃圾收集算法】的更多相关文章

1.垃圾收集概念 GC目的 分配内存,为每个新建的对象分配空间 确保还在使用的对象的内存一直还在,不能把有用的空间当垃圾回收了 释放不再使用的对象所占用的空间 我们把还被引用的对象称为活的,把不再被引用的对象认为是死的,也就是我们说的垃圾.GC 的工作就是找到死的对象,释放(也称为回收)这些对象所使用的空间的过程称为垃圾收集. 我们把 GC 管理的内存称为 堆(heap),垃圾收集启动的时机取决于各个垃圾收集器,通常,垃圾收集发生于整个堆或堆的部分已经被使用光了,或者使用的空间达到了某个百分比阈…
JVM垃圾收集算法的具体实现有很多种,本文只是介绍实现这些垃圾收集算法的三种思想和发展过程.所有的垃圾收集算法的具体实现都是遵循这三种算法思想而实现的. 1.标记-清除算法 标记-清除(Mark-Sweep)算法是最基础的垃圾收集算法.正如其名字描述的那样,该算法分为两个阶段:"标记"和"清除".首先标记出所有可以被回收的对象,然后经过一轮垃圾回收将所有被标记的对象的内存空间释放,即清除可被回收的对象.标记-清除算法的执行过程如下图所示: 该算法的优点是逻辑简单,最…
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 垃圾收集算法 垃圾收集算法主要有标记-清除算法.复制算法.标记-整理算法.分代收集算法这几种,对算法的具体实现不做过多探究,只对他们的设计思想进行介绍. 标记-清除算法 最基础的算法就是标记-清除(Mark-Sweep)算法,同它的名字一样,分为"标记"和"清除"两个阶段:首先标记出所有待回收的对象,标记完后统一回收所有被标记的对象.标记过程其实就是上一…
纠结的我,给我的JVM系列终于起了第三个名字,害,我真是太难了.从 JVM 到 每日五分钟,玩转 JVM 再到现在的给产品经理讲 JVM ,虽然内容为王,但是标题可以让更多的人看到我的文章,所以,历经了三个选题,最终定下来了这个. 这个名字的由来,且听我给你慢慢道来,从学习知识的角度上来说,最深入的方法就是把知识讲给别人听,那么为什么我要讲给程序员的天敌--产品经理呢? 那么问题的答案很简单,因为我「老婆」就是一个「产品经理」哈哈哈哈哈哈哈(听说现在流行这样玩? 认识的时候她是 Java 开发来…
垃圾收集算法 Mark-Sweep(标记-清除算法) 标记清除算法分为两个阶段,标记阶段和清除阶段.标记阶段任务是标记出所有需要回收的对象,清除阶段就是清除被标记对象的空间. 优缺点:实现简单,容易产生内存碎片.因为会存在大量的空间碎片,因为回收后的空间是不连续的,这样给大对象分配内存的时候可能会提前触发full gc. 标记-压缩算法 首先也需要从根节点开始对所有可达对象做一次标记,但之后,它并不简单地清理未标记的对象,而是将所有的存活对象压缩到内存的一端.之后,清理边界外所有的空间.这种方法…
简述 如果说收集算法时内存回收的方法论,那么垃圾收集器就是内存回收的具体实现.这里我们讨论的垃圾收集器是基于JKD1.7之后的Hotspot虚拟机,这个虚拟机包含的所有收集器如图: Serial 收集器 Serial收集器是一个单线程收集器,它在进行垃圾收集时,(Stop The World)必须暂停其它所有的工作线程,直到它收集结束.这对很多应用来说是无法接受的,试想你的计算机每运行1小时就会暂停5分钟,是否有种想砸电脑的冲动. Serial 收集器运行示意图 Serial 收集器适用场景 简…
JVM中的垃圾收集算法实现涉及大量的程序细节,而且各个平台的虚拟机操作内存的方法又各不相同,这里介绍几种垃圾收集算法的思想. 1.标记-清除算法 这是最基础的垃圾收集算法,分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成之后统一回收所有被标记的对象.它的不足之处有两个:1.效率问题,标记和清除两个过程的效率都不高.2.空间问题,在清除过程后,会产生很多内存碎片,空间碎片太多会导致以后在程序运行过程中需要分配较大对象时,无法找到足够的连续内存而不得不提前触发另一次垃圾收集动…
前言 在上篇中,我们把 JVM 中的垃圾收集算法有了一个大概的了解,又是一个阴雨连绵的周末,宅在家里的我们又开始了新一轮的学习: 产品大大:上周末我们说了垃圾收集算法,下面是不是要讲一下这些算法的应用呢? 我:当然,如果说垃圾收集算法是打狗棒法,那么垃圾收集器就是历届的丐帮帮主们,不同的帮主领悟到的自然也就不同,我先对这些帮主进行一个简单的介绍,看图! 我:我从回收的区域去对垃圾收集器进行了一个简单的划分,大致可以分为这样九种,下面就且听我为你一一道来. 产品大大:好哒 Serial 收集器 我…
标记-清除算法 此垃圾收集算法分为“标记”和“清除”两个阶段: 首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记对象,它的标记过程前面已经说过——如何判断对象是否存活/死去 死去的对象就会被标记,然后被清除. 它主要有两点不足: 一个是效率问题,标记和清除两个过程的效率都不高: 另一个是空间问题,标记清除之后会产生大量不连续的空间碎片,空间碎片太多可能会导致以后再程序运行过程中需要分配较大对象时, 无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作. 标记-清除算法的执行过程如…
JVM垃圾收集 1. 判断对象是否存活 引用计数算法 对象添加一个引用计数器,每个地方引用它,计数器值加+1:当引用失效,计算器值减1:任何时刻计数器为0的对象不可能被使用.引用计数算法实现简单,高效. 缺点:引用计数算法,很难解决相互引用的问题. objA.instance = B; objB.instance = C; 可达性分析算法 主流商用算法,通过一些列的"GC roots" 作为对象的起点,从这些节点开始向下搜索,锁走过的路径成为引用链(reference Chain),当…
Java 常见的垃圾收集器有哪些 实际上,垃圾收集器(GC,Garbage Collector)是和具体 JVM 实现紧密相关的,不同厂商(IBM.Oracle),不同版本的JVM,提供的选择也不同.接下来,我来谈谈最主流的 Oracle JDK. Serial GC 它是最古老的垃圾收集器,"Serial"体现在其收集工作是单线程的,并且在进 行垃圾收集过程中,会进入臭名昭著的"Stop-The-World"状态.当然,其单线程设计也意味着精简的 GC 实现,无需…
垃圾收集器2:收集算法 主要通过阅读<深入了解Java虚拟机>(周志明 著)和网络资源汇集而成,为本人学习JVM的笔记.同时,本文理论基于JDK 1.7版本,暂不考虑 1.8和1.9 的新特性,但可能初略提到. 垃圾收集算法主要有以下几种: 标记-清除算法(Mark-Sweep).复制算法(Copying) 和 标记-整理算法(Mark-Compact). 标记-清除算法(Mark-Sweep) 首先标记出所有需要回收的对象,标记完成后统一回收所有被标记对象. 主要不足之处: 效率问题 标记和…
 系列介绍|本系列主要是记录学习jvm过程中觉得重要的内容,方便以后复习 在说垃圾收集算法之前,先要说一下垃圾收集,从大的讲,垃圾收集需要考虑三件事情: 1.哪些内存需要回收 2.什么时候回收 3.如何回收 JVM在执行java程序时,把他管理的内存分为多个数据区域: 1.程序计数器(记录程序执行到哪了,各线程之间独立存储, 互不影响) 2.虚拟机栈(这个栈就是我们常说的jvm的“堆”和“栈”中的栈,这里存放的是编译期间可知的各种数据类型(8种基本类型).对象引用(reference类型,就是一…
1.垃圾对象的判断 Java堆中存放着几乎所有的对象实例,垃圾收集器对堆中的对象进行回收前,要先确定这些对象是否还有用,判定对象是否为垃圾对象有如下算法: (1):引用计数算法 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1,当引用失效时,计数器值就减1,任何时刻计数器都为0的对象就是不可能再被使用的. 引用计数算法的实现简单,判定效率也很高,在大部分情况下它都是一个不错的选择,当Java语言并没有选择这种算法来进行垃圾回收,主要原因是它很难解决对象之间的相互循环引用问题. 看…
JVM的垃圾回收算法有三种: 1.标记-清除(mark-sweep):啥都不说,直接上图 2.标记-整理(mark-compact) 3.复制(copy) 分代收集算法                                                    目前的垃圾回收都采用分代收集算法.也就衍生了很多垃圾收集器 “分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法. 在新生代中,每次…
判断哪些对象需要被回收 引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用的. 但是JVM没有使用此方法,因为此方法无法解决2个对象相互循环引用的问题. 可达性分析算法: 这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象…
前言 总所周知,jvm的垃圾收集算法一般包括标记.清除.整理三个阶段,最近在看了有关于垃圾收集的标记算法,记录一下自己的理解. 垃圾收集中标记算法有两种:一种是引用计数法,一种是根搜索算法. 引用记数法 引用计数法非常容易理解,jvm为每一个对象设立一个引用计数器,当该对象被引用时,计数器就加一,引用取消时则减一. 当jvm开始gc时,jvm判断该对象的引用计数器是否为0,若为0则标记为可清除对象. 引用计数器有个致命的缺点是无法解决循环依赖问题,这也导致这个算法被弃用. 如下图所示,当对象A中…
出处: https://mp.weixin.qq.com/s/IfUFuwn8dsvMIhTS3V01FA 对于JVM的垃圾收集(GC),这是一个作为Java开发者必须了解的内容,那么,我们需要去了解哪些内容呢,其实,GC主要是解决下面的三个问题: 哪些内存需要回收? 什么时候回收? 如何回收? 回答了这三个问题,也就对于GC算法的原理有了最基本的了解. 1 如何判定哪些内存需要回收 在Java虚拟机的堆中会存放着很多的对象,那么,我们需要回收垃圾的时候,是通过什么算法来判断哪些垃圾的生命周期已…
1 JVM 简单结构图   1.1 类加载子系统与方法区 类加载子系统负责从文件系统或者网络中加载 Class 信息,加载的类信息存放于一块称 为方法区的内存空间.除了类的信息外,方法区中可能还会存放运行时常量池信息,包括字符串字面量和数字常量(这部分常量信息是 Class 文件中常量池部分的内存映射). 1.2 Java 堆 java 堆在虚拟机启动的时候建立,它是 java 程序最主要的内存工作区域.几乎所有的 java 对象实例都存放在 java 堆中.堆空间是所有线程共享的,这是一块与…
1.GC     垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 java 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的. 2.对象存活判断     判断对象是否存活一般有两种方式: 1.引用计数:每个对象…
1. 一些概念 1.1 垃圾&垃圾收集 垃圾:在 JVM 语境下,"垃圾"指的是死亡的对象所占据的堆空间. 垃圾收集:所谓"垃圾收集",就是将已分配出去.但不再使用的内存回收回来,以便能再次分配. 1.2 对象是否死亡 如何判断一个对象是否死亡(即不可能再被任何途径使用)?通常有以下两种方法: 1.2.1 引用计数法 引用计数法(Reference Counting):为每个对象添加一个引用计数器,用来统计指向该对象的引用个数.当有地方引用它时,计数器加一:…
垃圾收集是java语言的亮点,大大提高了开发人员的效率. 垃圾收集即GC,当内存不足的时候触发,不同的jvm版本算法和机制都有差别. 我是李福春,我在准备面试,今天的问题是: jvm的垃圾回收算法有哪些?有哪些垃圾收集器? 答:jvm的垃圾回收首先需要标注出可回收的对象,采用的是可达图算法(从对象出发,绘制出出对象的引用关系图, 当从活动对象出发,在图中不可达的对象即可标注为可回收对象) jvm的垃圾回收算法有3种,列举如下: 1, 标记清除算法.(即把标注的可回收对象直接清理,这样会带来内存碎…
本文整理自周志明老师的<深入理解Java虚拟机-JVM高级特性与最佳实践>第3版的第二章和第三章. 加上了一些网上拼拼凑凑的图片,个人认为很多博客复制来复制去,最后的东西都看不懂,所以从书里码了一下知识点,也用作自己记忆. 一.一个命令 上面的结果显示了 jvm 的模式: Client VM(-client),为在客户端环境中减少启动时间而优化: Server VM(-server),为在服务器环境中最大化程序执行速度而设计. 在文件路径:jdk-11.0.7+10\lib 下面可以更改 jv…
一.垃圾回收的基本概念 垃圾回收(GC,Garbage Collection),指内存中不会再被使用的对象清理掉. 垃圾回收有很多种算法:如引用计数法.标记压缩法.复制算法.分代/分区的思想 二.垃圾回收算法 1.引用计数法:这是个比较古老而经典的垃圾收集算法,其核心就是在对象被其他所引用时计数器+1,当应用时效时则-1,但是这种方式有非常严重的问题:无法处理循环引用的情况.还有就是每次进行+-操作比较浪费系统的性能 2.标记清除法:就是分为标记和清除两个阶段进行处理内存中的对象.这种方式也有非…
一.垃圾回收算法 1.标记-清除算法 1)工作流程 算法分为"标记"和"清除"阶段:首先标记出所有需要回收的对象(标记阶段),在标记完成后统一回收所有被标记的对象(回收阶段). 2)缺点 a. 效率问题:标记和清除这两个过程的效率都不高. b. 空间问题:会产生大量的不连续碎片. 2.复制算法(新生代垃圾回收算法) 1)工作流程 将内存划分为大小相等的两块,每块只使用其中的一块,另外一块作为保留区域,当进行垃圾回收时,将使用区域的存活对象一次性进行赋值到保留区域,而…
当前商业虚拟机的垃圾收集都采用"分代收集"算法,即根据对象生命周期的不同,将内存划分几块,一般为新生代和老年代,不同的代根据其特点使用最合适的垃圾收集算法 一,标记-清除算法: 该算法分为"标记"."清除"2个过程,首先标记需要清除的对象,然后统一清除 这个算法有2个明显的缺点: 1,标记和清除的效率都不高 2,垃圾收集后,内存碎片化严重 二,复制算法: 将内存分大小相同的2块,每次只使用其中的一块.当一块中的内存耗光,则将还活着的对象复制到另一…
 [JVM垃圾收集算法] 1)标记-清除算法: 标记阶段:先通过根节点,标记所有从根节点开始的对象,未被标记的为垃圾对象(错了吧?) 清除阶段:清除所有未被标记的对象 2)复制算法: 将原有的内存空间分为两块,每次只使用一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未被使用的内存块中,然后清除正在使用的内存块中的所有对象. 3)标记-整理算法: 标记阶段:先通过根节点,标记所有从根节点开始的可达对象,未被标记的为垃圾对象 整理阶段:将所有的存活对象压缩到内存的一段,之后清理边界所有的空间…
1. 介绍 JVM提供了多种垃圾收集器,应该根据应用选择一种合适的垃圾收集器. 垃圾回收管理内存通过如下操作: 在年轻代分配对象,把年龄大的对象晋升到老年代. 当年老代超过阈值的时候,并发标记收集. 通过合并内存,拷贝内存的方式对内存进行整理,回收可以内存. 垃圾回收什么时候会产生问题?对于有些应用,垃圾回收永远都不会成为问题,有些应用在垃圾回收期间短暂的暂 停,适当的垃圾回收频率下也可以表现的很好. 阿姆达尔定律(http://ifeve.com/amdahls-law/)意味着程序的性能受限…
一. 概述 说起垃圾收集(Garbage Collection, GC), 大部分人都把这项技术当做Java语言的伴随生产物. 事实上, GC的历史远远比Java久远, 1960年 诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言. 当Lisp还在胚胎时期时,人们就在思考GC需要完成的三件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 现在内存的动态分配与内存回收技术已经相当成熟, 那为什么我们还要去了解GC和内存分配呢? 答案很简单: 当需要排查各种内存溢出, 内…
前言 从如何判定对象消亡的角度出发,垃圾收集算法可以划分为"引用计数式垃圾收集"(Reference Counting GC)和"追踪式垃圾收集"(Tracing GC)两大类,这两类也常被称作"直接垃圾收集"和"间接垃圾收集".由于束流Java虚拟机中使用 的都是"追踪式垃圾收集",所以后续介绍的垃圾收集算法都是属于追踪式的垃圾收集. 分代式收集理论 当前商业虚拟机的垃圾收集器,大多数都遵循了"…