Java虚拟机(JVM):第四幕:自动内存管理 - 经典垃圾收集器
前言:如果说收集算法是内存回收的方法论,那么垃圾收集器则是内存回收的实践者。整哥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):第四幕:自动内存管理 - 经典垃圾收集器的更多相关文章
- 深入理解Java虚拟机之读书笔记一 自动内存管理机制
一.运行时数据区域 1.程序计数器是线程的私有空间,每个线程都有.针对线程执行的是Java代码还是Native代码有两种取值,Java代码时:虚拟机字节码指令的地址:Native代码时:计数值为Und ...
- JAVA之自动内存管理机制
一.内存分配 1.JVM体系结构 2.运行时数据区域 3.内存分配二.内存回收 1.垃圾收集算法 2.垃圾收集器三.相关参考一.内存分配JVM体系结构 在了解自动内存管理的内存分配之前,我们先看下JV ...
- .NET 自动内存管理(垃圾收集GC)
自动内存管理(垃圾收集GC) 在面向对象的环境里, 要使用资源,必须为响应 的类型分配一定 的内存空间.下面是访问一个资源所需要的几个步骤: 1. 调用中间语言(IL)的newobj 指令.当我们用N ...
- JVM | 第1部分:自动内存管理与性能调优《深入理解 Java 虚拟机》
目录 前言 1. 自动内存管理 1.1 JVM运行时数据区 1.2 Java 内存结构 1.3 HotSpot 虚拟机创建对象 1.4 HotSpot 虚拟机的对象内存布局 1.5 访问对象 2. 垃 ...
- [深入理解Java虚拟机]<自动内存管理>
Overview 走近Java:介绍Java发展史 第二部分:自动内存管理机制 程序员把内存控制的权利交给了Java虚拟机,从而可以在编码时享受自动内存管理.但另一方面一旦出现内存泄漏和溢出等问题,就 ...
- 深入理解Java虚拟机(自动内存管理机制)
文章首发于公众号:BaronTalk 书籍真的是常读常新,古人说「书读百遍其义自见」还是很有道理的.周志明老师的这本<深入理解 Java 虚拟机>我细读了不下三遍,每一次阅读都有新的收获, ...
- JVM自动内存管理-Java内存区域与内存溢出异常
摘要: JVM内存的划分,导致内存溢出异常的可能区域. 1. JVM运行时内存区域 JVM在执行Java程序的过程中会把它所管理的内存划分为以下几个区域: 1.1 程序计数器 程序计数器是一块较小的内 ...
- JVM自动内存管理机制——Java内存区域(下)
一.虚拟机参数配置 在上一篇<Java自动内存管理机制——Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a) ...
- JVM自动内存管理机制——Java内存区域(上)
一.JVM运行时数据区域概述 Java相比较于C/C++的一个特点就是,在虚拟机自动内存管理机制的帮助下,我们不需要为每一个操作都写像C/C++一样的delete/free代码,所以也不容易出现内存泄 ...
- 【深入理解Java虚拟机】自动内存管理机制——垃圾回收机制
Java与C++之间有一堵有内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来.C/C++程序员既拥有每一个对象的所有权,同时也担负着每一个对象生 ...
随机推荐
- Python开发中自动化构建项目结构样式
摘要:在项目开发过程中,一个良好的项目结构对于团队的协作和代码的可维护性起着重要作用.通过使用自动生成项目结构文字样式的工具.不仅节省了手动编写项目结构的麻烦,还确保了结构的一致性和准确性. 本文分享 ...
- 多个commit合并为一个
在进行多个commit合并成一个博客编写的过程中,你可以使用以下代码示例作为参考: # 合并多个commit git rebase -i HEAD~N # N代表需要合并的commit数目,例如合并最 ...
- JavaScript 整理的基础的方法
innerHTML //innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML. innertext//innerText 属性返回文本值 没有结构信息 $("#test& ...
- 【HTML】Echart图表
layui-echarts 简介 基于layui 实现的 echart 图表 Echart 官网 示例 Echart示例 下载Echart Echart下载 我们选择最下面的在线定制 我这里就按照它默 ...
- Reactjs学习笔记
本篇是关于React的简介 ReactJS是Facebook推出的一款前端框架,2013年开源,提供了一种函数式编程思想,拥有比较健全的文档和完善的社区,在React16的版本中对算法进行了革新,称之 ...
- [nginx]lua控制响应头
前言 适用场景:添加CDN缓存时间.操作set-cookie.标记业务数据类型等. 获取响应头 指令:ngx.resp.get_headers 语法:headers = ngx.resp.get_he ...
- 何时使用Elasticsearch而不是MySql
MySQL 和 Elasticsearch 是两种不同的数据管理系统,它们各有优劣,适用于不同的场景.本文将从以下几个方面对它们进行比较和分析: 数据模型 查询语言 索引和搜索 分布式和高可用 性能和 ...
- 分布式TCC事务相关问题
TCC分别是Try,Confirm,Cancel,分为三阶段. 第一阶段Try:业务检查及资源预留,尝试事务操作但不提交. 第二阶段Confirm:事务操作提交. 第三阶段Cancel:如果Try阶段 ...
- 详细讲解原生js拖拽
场景描述 今天遇见一个问题,那就是产品希望在弹出来的窗口. 可以移动这个弹窗的位置 增加用户体验,我们直接使用的element-ui中的 Dialog 对话框 我们现在需要拖拽标题,移动元素位置 元素 ...
- Hybird 技术讨论:热更新原理解析
原生应用 VS 混合应用 大家对于原生应用和混合应用已经非常熟悉了,这里就不再进行详细的介绍,用通俗易懂的话解释下他们的一些特点. 1.原生应用 在 Android.iOS 等移动平台上利用提供的 ...