java虚拟机学习总结之GC回收算法与GC收集器

GC回收算法

1.标记清除算法
分为标记阶段和清除阶段
标记阶段:通过特定的判断方式找出无用的对象实例并将其标记
清除阶段:将已标记的对象所占用的内存回收
缺点:运行多次以后容易产生空间碎片,当需要一整段连续内存时虽然空间足够但是无法分配,会多次触发GC操作。

2.复制算法
为了提高标记清除算法的效率,减少内存碎片的产生而出现的,该算法将内存空间分为两个完全相同的两部分,每次只使用其中的一部分。
分为标记阶段、复制阶段和清除阶段
标记阶段:同标记清除算法的标记阶段一致
复制阶段:将为标记的对象全部复制到另一块未使用的空间中
清除阶段:将已标记对象所在空间全部清除
缺点:虽然解决了空间碎片的问题, 但是内存使用量变为了当前内存的一半

3.标记整理算法
为了解决复制算法只能使用一半内存的情况
分为标记阶段、整理阶段、清除阶段
标记阶段:同标记清除算法的标记阶段一致
整理阶段:将未被标记的对象全部移动到固定的一端,将所有存活的对象整齐的排列在内存的一端
清除阶段:将未被标记的对象的另一块区域清空

4.分代收集算法
根据对象存活周期的不同将内存划分为新生代区域和老年代区域,在新生代中的对象生存时间短,通常为朝生夕死类型,老年代中的对象通常存活的时间都很长。
根据新生代中对象的类型采用改进的复制算法进行垃圾收集,将新生代分为Eden区和两个大小相等的Servior区,它们的比例默认为8:1,每次只使用Eden区和其中一个Servior区,垃圾收集时将未标记的对象移入到另一个Servior区。
根据老年代对象的类型采用标记整理算法。
此算法是目前HotSpot虚拟机中默认使用的算法。

GC收集器

新生代

1.Serial收集器
是一个单线程收集器,会出现Stop The World,即该收集器运行时会暂停其他所有线程。
适用于客户端模式下的虚拟机

2.ParNew收集器
是Serial收集器的多线程版本
适用于Server模式下的虚拟机
默认开启的收集线程数和CPU核数相同

3.Parallel Scavenge收集器
类似于ParNew收集器,其更关注于吞吐量
是通过调小新生代空间来实现控制吞吐量的操作
默认提供自适应的调节策略

老年代

1.Serial Old收集器
特性同Serial收集器相同
因为是在老年代,使用的收集算法为标记整理算法

2.Parallel Old收集器
特性同Parallel Scavenge收集器相同,是Parallel Scavenge收集器的老年代版本
使用标记整理算法

3.CMS收集器
分为初始标记、并发标记、重新标记和并发清除阶段
初始标记阶段:此阶段标记GCRoots直接关联的对象,需要停止所有线程
并发标记阶段:同用户线程一起工作,更正标记的对象
重新标记阶段:修正并发标记阶段因用户操作导致的变化
并发清除阶段:同用户线程一起工作,清除垃圾
缺点:对资源敏感,无法处理浮动垃圾
默认开启的线程数为(CPU数量+3)/4

4.G1收集器(新生代和老年代通用)
分为初始标记、并发标记、最终标记和筛选回收阶段
初始标记阶段:此阶段标记GCRoots直接关联的对象,需要停止所有线程
并发标记阶段:从GC Roots开始进行可达性分析,与用户线程一起工作
最终标记阶段:修正在并发标记阶段用户操作导致的变化
筛选回收阶段:使用多线程的方式清除垃圾
特点:G1收集器将内存分为了多个大小相同的Region,虽然还存在分区的概念,但是已经不是物理上隔离了,它们都是一部分Region的集合
名字的由来:优先回收价值最大的Region

各个收集器的搭配情况

 注:Hot Spot 虚拟机用的就是 分代收集算法,在新生代中用的是改进的复制算法,主要涉及的收集器(Serial收集器、ParNew收集器、Parallel Scavenge收集器以及G1收集器),在老年代中用的是标记整理算法,主要涉及的收集器(Serial Old收集器、Parallel Old收集器、CMS收集器、G1收集器)。

原文地址:https://blog.csdn.net/luffysk/article/details/82730058

原文地址:https://www.cnblogs.com/Tony100/p/12072048.html

时间: 2024-07-29 09:08:14

java虚拟机学习总结之GC回收算法与GC收集器的相关文章

(转)《深入理解java虚拟机》学习笔记3——垃圾回收算法

Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这三个区域的内存分配和回收都具有确定性.垃圾回收重点关注的是堆和方法区部分的内存. 常用的垃圾回收算法有: (1).引用计数算法: 给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器都为0的对象就是不再被使用的,垃

Java虚拟机学习5、Java垃圾回收(GC)机制详解

哪些内存需要回收? 哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”无非就是那些不可能再被任何途径使用的对象.那么如何找到这些对象? 1.引用计数法 这个算法的实现是,给对象中添加一个引用计数器,每当一个地方引用这个对象时,计数器值+1:当引用失效时,计数器值-1.任何时刻计数值为0的对象就是不可能再被使用的.这种算法使用场景很多,但是,Java中却没有使用这种算法,因为这种算法很难解决对象之间相互引用的情况.看一段代码 1 /** 2 * 虚拟机参数:-verbose:g

java虚拟机学习-JVM调优总结-分代垃圾回收详述(9)

为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象.线程.Socket连接,这类对象跟业务直接挂钩,因此生命周期比较长.但是还有一些对象,主要是程序运行过程中生成的临时变量,这些对象生命周期会比较短,比如:String对象,由于其不变类的特性,系统会产生大量的这些对象,有些对象甚至

Java虚拟机内存模型及垃圾回收监控调优

Java虚拟机内存模型及垃圾回收监控调优 如果你想理解Java垃圾回收如果工作,那么理解JVM的内存模型就显的非常重要.今天我们就来看看JVM内存的各不同部分及如果监控和实现垃圾回收调优. JVM内存模型         正如你上图所看到的,JVM内存可以划分为不同的部分,广义上,JVM堆内存可以划分为两部分:年轻代和老年代(Young Generation and Old Generation) 年轻代(Young Generation) 年轻代用于存放由new所生成的对象.当年轻代空间满时,

java虚拟机学习-触摸java常量池(13)

java虚拟机学习-深入理解JVM(1) java虚拟机学习-慢慢琢磨JVM(2) java虚拟机学习-慢慢琢磨JVM(2-1)ClassLoader的工作机制 java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3) java虚拟机学习-JVM内存管理:深入垃圾收集器与内存分配策略(4) java虚拟机学习-JVM调优总结(5) java虚拟机学习-JVM调优总结(6) java虚拟机学习-JVM调优总结-基本垃圾回收算法(7) java虚拟机学习-JVM调优总结-垃圾回收面临的

java虚拟机学习(五)--垃圾收集器总结

JVM--垃圾收集器总结 一.垃圾收集器概览 收集算法是内存回收的方法论,垃圾收集据是内存回收的具体实现.Java虚拟机规范中对垃圾收集器应该如何实现没有规定,不同的厂商.不同版本的虚拟机所提供的垃圾收集器可能会有很大差别,一般都会提供参数供用户根据自己的所用特点和要求组合出各个年代所使用的收集器.下面是基于JDK 1.7 Update 14 之后的HotSpot 虚拟机垃圾收集器.如果两个收集器之间有连线就说明它们可以搭配使用.直到现在还没有最好的收集器,更加设有万能的收集器,只是对具体应用选

深入理解Java虚拟机 学习总结

一.运行时数据区域 Java虚拟机管理的内存包括几个运行时数据内存:方法区.虚拟机栈.本地方法栈.堆.程序计数器,其中方法区和堆是由线程共享的数据区,其他几个是线程隔离的数据区 1.1 程序计数器 程序计数器是一块较小的内存,他可以看做是当前线程所执行的行号指示器.字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码的指令,分支.循环.跳转.异常处理.线程恢复等基础功能都需要依赖这个计数器来完成.如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节

GC回收算法--当女友跟你提分手!

Java语言引入了垃圾回收机制,让C++语言中令人头疼的内存管理问题迎刃而解,使得我们Java狗每天开开心心地创建对象而不用管对象死活,这些都是Java的垃圾回收机制带来的好处.但是Java的垃圾回收机制的核心原理是什么呢?今天我们来聊聊GC回收算法吧. JVM的GC回收场景很复杂,不是单个算法就可以搞定的,大致可以分为可达性分析算法.标记-清除算法.标记-整理算法.分代回收算法.复制算法. 广场上,女朋友突然跟你闹分手,然后头也不回地一个人走了,留下你一个人站在树下,BGM缓缓响起"雪花飘飘

GC回收算法

GC回收算法 https://www.cnblogs.com/missOfAugust/p/9528166.html Java语言引入了垃圾回收机制,让C++语言中令人头疼的内存管理问题迎刃而解,使得我们Java狗每天开开心心地创建对象而不用管对象死活,这些都是Java的垃圾回收机制带来的好处.但是Java的垃圾回收机制的核心原理是什么呢?今天我们来聊聊GC回收算法吧. JVM的GC回收场景很复杂,不是单个算法就可以搞定的,大致可以分为可达性分析算法.标记-清除算法.标记-整理算法.分代回收算法