前言:如果说收集算法是内存回收的方法论,那么垃圾收集器则是内存回收的实践者。整哥Java堆 :Full GC。

  1、Serial收集器:最基础、历史最悠久的收集器,这是一个单线程工作的收集器。

  2、ParNew收集器:是Serial收集器的多线程并行版本,可以说是跟Serial完全一样。

  CMS收集器:实现了垃圾收集线程与用户线程(基本上)同时工作,作为老年代的收集器,ParNew收集器是激活CMS后的默认新生代的收集器,直到CMS的出现巩固了PartNew收集器的位置。然后,PartNew合并入CMS中,成为它专门处理新生代的组成部分,存在线程交互的开销。

  3、Parallel Scavenge 收集器:是一款新生代收集器,基于标记 - 复制算法实现的收集器,也是并行收集的多线程收集器。特点主要是与其他收集器不同,CMS收集器的关注点尽可能地缩短垃圾收集时的用户线程的停顿时间。而Parallel Scavenge 收集器的目标是达到一个可控制的吞吐量

  所谓吞吐量是处理器用于运行用户代码的时间与处理器 总消耗时间的比值:

  停顿时间越短越需要与用户交互且需要保证服务响应质量的程序,Parallel Scavenge 收集器提供了两个参数来精确的控制吞吐量:分别为控制最大垃圾收集停顿时间的参数以及直接设置吞吐量大小的参数。Parallel Scavenge 收集器也被称为“吞吐量优先收集器”。除了上述的两个参数之外,还有一个开关参数,这种调节方式被称为垃圾收集的自适应调整策略。自适应调整策略也是Parallel Scavenge 收集器区别于ParNew收集器的一个重要特征。

  4、Serial Old 收集器:是Serial收集器的老年代版本,同样是一个单线程收集器,使用标记 - 整理算法。主要是供客户端模式下的HotSpot虚拟机使用。

  5、Parallel Old 收集器:同样是Parallel Scavenge 收集器的老年代版本,支持多线程并发收集,基于标记 - 整理算法来实现,与Parallel Scavenge 收集器的搭配,满足了“吞吐量优先”的收集器

  6、CMS收集器:是一种基于标记 - 清除的算法来实现的,主要用来获取最短回收停顿时间为目标的收集器,较为关注服务的响应速度,希望系统的停顿时间尽可能的短,来给用户带来良好的交互体验。运行过程主要有四个步骤,包括:1、初始标记。2、并发标记。3、重新标记。4、并发清除。

  CMS收集器有很明显的缺陷。首先CMS收集器对于处理器资源非常的敏感,只有在核心的处理器数量在四个或以上时,回收垃圾的线程才不会占用太多的处理器资源,因此面对这种情况,提供了一种增量式并发收集器,用户线程交替运行,尽可能减少垃圾收集线程的独占时间,虽然会导致整个垃圾的手机过程变长,但是对于用户程序的影响会显得小一些。

  浮动垃圾:在CMS的并发标记和并发清理阶段,用户线程是继续运行的,程序在运行时伴随着新的垃圾对象不断产生,但是这一部分垃圾对象时出现在标记过程之后,CMS收集器没有办法在本次处理掉它们,只好留待下一次垃圾收集时,再次清理掉。

  7、Garbage First收集器:简称为G1收集器:局部收集的设计思路,在JDK 10的时候,提出使用“统一的垃圾收集器接口”,将内存回收的“行为”与“实现”进行分离。用来关注停顿时间的控制来进行收集垃圾。G1收集器开创了基于Region的堆内存布局,将连续的Java堆划分为多个大小相等的独立区域,根据需求去扮演新生代的不同空间。

  此外,Region还有一类特殊的Humongous区域,用来存储大对象:超过一个Region区域一半容量的对象。虽然G1收集器保留了新生代与老年代的概念。这是因为,G1收集器建立了可预测的停顿时间模型。

  Region作为单次回收的最小单元,思路:跟踪每一个Region里面的垃圾积累的“价值”大小,价值:回收所获得的空间大小以及回收所需要时间的经验值,后台建立维护一个优先级的列表,来优先回收处理收益最大的Region。

  针对Java堆分为多个独立的Region,Region之间存在的跨Region引用对象,采用卡表(我指向谁,谁指向我)的形式,G1收集器通过原始快照(SATB)算法来保证收集线程与用户线程互不干扰地运行。为了持续的创建新的对象,G1为每一个Region设计了两个名为TAMS的指针,将一部分空间划分出来用于并发回收过程中的新对象分配,默认在这个地址上的对象是被隐式标记的,默认为存活状态。

  每一种垃圾收集器都有自己的优点和缺点,针对具体的场景,需要具体的分析。随着时间的发展,HotSpot虚拟机的开发者对于G1的不断优化,让G1在收集器的占有率市场一直稳步提高。

Java虚拟机(JVM):第四幕:自动内存管理 - 经典垃圾收集器的更多相关文章

  1. 深入理解Java虚拟机之读书笔记一 自动内存管理机制

    一.运行时数据区域 1.程序计数器是线程的私有空间,每个线程都有.针对线程执行的是Java代码还是Native代码有两种取值,Java代码时:虚拟机字节码指令的地址:Native代码时:计数值为Und ...

  2. JAVA之自动内存管理机制

    一.内存分配 1.JVM体系结构 2.运行时数据区域 3.内存分配二.内存回收 1.垃圾收集算法 2.垃圾收集器三.相关参考一.内存分配JVM体系结构 在了解自动内存管理的内存分配之前,我们先看下JV ...

  3. .NET 自动内存管理(垃圾收集GC)

    自动内存管理(垃圾收集GC) 在面向对象的环境里, 要使用资源,必须为响应 的类型分配一定 的内存空间.下面是访问一个资源所需要的几个步骤: 1. 调用中间语言(IL)的newobj 指令.当我们用N ...

  4. JVM | 第1部分:自动内存管理与性能调优《深入理解 Java 虚拟机》

    目录 前言 1. 自动内存管理 1.1 JVM运行时数据区 1.2 Java 内存结构 1.3 HotSpot 虚拟机创建对象 1.4 HotSpot 虚拟机的对象内存布局 1.5 访问对象 2. 垃 ...

  5. [深入理解Java虚拟机]<自动内存管理>

    Overview 走近Java:介绍Java发展史 第二部分:自动内存管理机制 程序员把内存控制的权利交给了Java虚拟机,从而可以在编码时享受自动内存管理.但另一方面一旦出现内存泄漏和溢出等问题,就 ...

  6. 深入理解Java虚拟机(自动内存管理机制)

    文章首发于公众号:BaronTalk 书籍真的是常读常新,古人说「书读百遍其义自见」还是很有道理的.周志明老师的这本<深入理解 Java 虚拟机>我细读了不下三遍,每一次阅读都有新的收获, ...

  7. JVM自动内存管理-Java内存区域与内存溢出异常

    摘要: JVM内存的划分,导致内存溢出异常的可能区域. 1. JVM运行时内存区域 JVM在执行Java程序的过程中会把它所管理的内存划分为以下几个区域: 1.1 程序计数器 程序计数器是一块较小的内 ...

  8. JVM自动内存管理机制——Java内存区域(下)

    一.虚拟机参数配置 在上一篇<Java自动内存管理机制——Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a) ...

  9. JVM自动内存管理机制——Java内存区域(上)

    一.JVM运行时数据区域概述 Java相比较于C/C++的一个特点就是,在虚拟机自动内存管理机制的帮助下,我们不需要为每一个操作都写像C/C++一样的delete/free代码,所以也不容易出现内存泄 ...

  10. 【深入理解Java虚拟机】自动内存管理机制——垃圾回收机制

      Java与C++之间有一堵有内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来.C/C++程序员既拥有每一个对象的所有权,同时也担负着每一个对象生 ...

随机推荐

  1. 个人博客迁移到托管平台Netlify

    Netlify是一家国外的静态网站的托管平台,提供免费的https,自动化部署和升级,可以监控GitHub.GitLab或者Bitbucket做到自动更新发布. 个人体会访问速度不是很理想,不如部署在 ...

  2. 基于LLVM的海量数据排序算法研究。(二维表的排序算法)

    当待排序数据内容大于内存容量时,需将待排序内容分块,要进行排序的分块传入内存,未处于排序状态的存入外存,外存的读写时间是内存的百万倍,因此在内外存储器之间传输分块所消耗的 I/O 时间是大数据排序算法 ...

  3. Ubutnu 20.04 安装和使用单机版hadoop 3.2 [转载]

    按照此文档操作,可以一次部署成功:Ubutnu 20.04 安装和使用单机版hadoop 3.2 部署之后,提交测试任务报资源问题.原因是yarn还需要配置,如下: $ cat yarn-site.x ...

  4. 2023-7-26 Dynamic替代部分反射的简单实现方式

    Dynamic与反射的使用 [作者]长生 实体类 public class School{ public int GetAge(){ return 100; } } 使用反射获取对象里的方法 Scho ...

  5. LeetCode 周赛上分之旅 # 36 KMP 字符串匹配殊途同归

    ️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...

  6. [git]记配置本地git到gitlab并推送

    前言 gitlab仓库地址:git@192.168.0.12:godev/gohello.git 步骤 # 配置用户 git config --global user.name "zhang ...

  7. 使用在线Excel时,有哪些方法可以引入计算函数?

    摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在日常生活和工作中,我们都会或多或少的使用Excel中的 ...

  8. 独奏者2 序章的wp

    0x01 0ctf_2017_babyheap 2023.7.24 国防科技大学 合肥 本题除了fastbin attack,最重要的是伪造fakechunk,使得存放chunk的指针有两个指向同一个 ...

  9. Mysql高级8-触发器

    一.触发器 触发器是与表有关的数据库对象,指在insert/update/delete之前或者之后,触发并执行触发器中定义的sql语句集合,触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志 ...

  10. 如何找到docker容器中的网卡外联的veth pair的另一张网卡

    1.概述 在Docker容器中,每个容器都有一个或多个网络接口(网卡),用于连接容器内部与宿主机或其他容器进行通信.这些网络接口中的一些可能是veth pair,也就是虚拟以太网对,它们以成对的方式存 ...