JAVA虚拟机09---垃圾回收---经典垃圾回收器
1.Serial收集器
1.1简介
1.2使用算法
标记-复制算法
1.3线程工作情况
1.4使用区域
新生代
1.5优缺点
1.5.1缺点
1)它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束
1.5.2优点
1)是简单而高效(与其他收集器的单线程相比)
对于内存资源受限的环境,它是所有收集器里额外内存消耗(Memory Footprint)[1]最小的;对于单核处理器或处理器核心数较少的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。
1.6使用情况
1)在JDK 1.3.1之前,是HotSpot虚拟机新生代收集器的唯一选择
2)迄今为止,它依然是HotSpot虚拟机运行在客户端模式下的默认新生代收集器
在用户桌面的应用场景以及近年来流行的部分微服务应用中,分配给虚拟机管理的内存一般来说并不会特别大,收集几十兆甚至一两百兆的新生代(仅仅是指新生代使用的内存,桌面应用甚少超过这个容量),垃圾收集的停顿时间完全可以控制在十几、几十毫秒,最多一百多毫秒以内,只要不是频繁发生收集,这点停顿时间对许多用户来说是完全可以接受的。所以,Serial收集器对于运行在客户端模式下的虚拟机来说是一个很好的选择
2.ParNew收集器
2.1简介
2.2使用算法
标记-复制算法
2.3线程工作情况
2.4使用区域
新生代
2.5优缺点
2.5.1缺点
1)它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束
2)除了Serial收集器外,目前只有它能与CMS收集器配合工作
2.5.2优点
并行收集的多线程收集
2.6使用情况
1)是不少运行在服务端模式下的HotSpot虚拟机,尤其是JDK 7之前的遗留系统中首选的新生代收集器(除了Serial收集器外,目前只有它能与CMS收集器配合工作)
2)自JDK 9开始,ParNew加CMS收集器的组合就不再是官方推荐的服务端模式下的收集器解决方案了。官方希望它能完全被G1所取代。ParNew可以说是HotSpot虚拟机中第一款退出历史舞台的垃圾收集器
3.Parallel Scavenge收集器
3.1简介
3.2使用算法
标记-复制算法
3.3线程工作情况
3.4使用区域
新生代
3.5优缺点
3.5.1缺点
1)它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束
3.5.2优点
1)可控制的吞吐量
3.6使用情况
对于收集器运作不太了解,手工优化存在困难的话,使用Parallel Scavenge收集器配合自适应调节策略,把内存管理的调优任务交给虚拟机去完成也许是一个很不错的选择。只需要把基本的内存数据设置好(如-Xmx设置最大堆),然后使用-XX:MaxGCPauseMillis参数(更关注最大停顿时间)或-XX:GCTimeRatio(更关注吞吐量)参数给虚拟机设立一个优化目标,那具体细节参数的调节工作就由虚拟机完成了。自适应调节策略也是Parallel Scavenge收集器区别于ParNew收集器的一个重要特性
4.CMS收集器
4.1简介
4.2算法
标记-清除算法。
4.3运行过程
是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录。多线程,需要stop the world
4.4使用区域
老年代
4.5优缺点
4.5.1缺点
1)CMS收集器对处理器资源非常敏感
2)CMS收集器无法处理“浮动垃圾”(Floating Garbage),有可能出现“Con-current ModeFailure”失败进而导致另一次完全“Stop The World”的Full GC的产生
在CMS的并发标记和并发清理阶段,用户线程是还在继续运行的,程序在运行自然就还会伴随有新的垃圾对象不断产生,但这一部分垃圾对象是出现在标记过程结束以后,CMS无法在当次收集中处理掉它们,只好留待下一次垃圾收集时再清理掉。这一部分垃圾就称为“浮动垃圾”
3)有大量碎片空间产生
4.5.2优点
5.Garbage First收集器---G1
5.1简介
5.2详细介绍
5.2.1Region堆内存布局
在G1收集器出现之前的所有其他收集器,包括CMS在内,垃圾收集的目标范围要么是整个新生代(Minor GC),要么就是整个老年代(Major GC),再要么就是整个Java堆(Full GC)。
Region之中,G1的大多数行为都把Humongous Region作为老年代的一部分来进行看待。
First”名字的由来。这种使用Region划分内存空间,以及具有优先级的区域回收方式,保证了G1收集器在有限的时间内获取尽可能高的收集效率
5.2.3各种问题
5.3运行过程
5.4算法
5.5G1和CMS比较
5.5.1优势
1)在延迟可控的情况下获得尽可能高的吞吐量
3)分Region的内存布局
4)按收益动态确定回收集
5)G1运作期间不会产生内存空间碎片
6)从G1开始,最先进的垃圾收集器的设计导向都不约而同地变为追求能够应付应用的内存分配速率(Allocation Rate),而不追求一次把整个Java堆全部清理干净。这样,应用在分配,同时收集器在收集,只要收集的速度能跟得上对象分配的速度,那一切就能运作得很完美
5.5.2劣势
1)G1无论是为了垃圾收集产生的内存占用(Footprint)还是程序运行时的额外执行负载(Overload)都要比CMS要高
2)G1的卡表实现更为复杂,这导致G1的记忆集(和其他内存消耗)可能会占整个堆容量的20%乃至更多的内存空间。相比起来CMS的卡表就相当简单,只有唯一一份,而且只需要处理老年代到新生代的引用,反过来则不需要
3)CMS用写后屏障来更新维护卡表。而G1除了使用写后屏障来进行同样的(由于G1的卡表结构复杂,其实是更烦琐的)卡表维护操作外,为了实现原始快照搜索(SATB)算法,还需要使用写前屏障来跟踪并发时的指针变化情况
4)相比起增量更新算法,原始快照搜索能够减少并发标记和重新标记阶段的消耗,避免CMS那样在最终标记阶段停顿时间过长的缺点,但是在用户程序运行过程中确实会产生由跟踪引用变化带来的额外负担。由于G1对写屏障的复杂操作要比CMS消耗更多的运算资源,所以CMS的写屏障实现是直接的同步操作,而G1就不得不将其实现为类似于消息队列的结构,把写前屏障和写后屏障中要做的事情都放到队列里,然后再异步处理
5.5.3小结
JAVA虚拟机09---垃圾回收---经典垃圾回收器的更多相关文章
- (转)《深入理解java虚拟机》学习笔记3——垃圾回收算法
Java虚拟机的内存区域中,程序计数器.虚拟机栈和本地方法栈三个区域是线程私有的,随线程生而生,随线程灭而灭:栈中的栈帧随着方法的进入和退出而进行入栈和出栈操作,每个栈帧中分配多少内存基本上是在类结构 ...
- JVM垃圾回收算法及回收器详解
引言 本文主要讲述JVM中几种常见的垃圾回收算法和相关的垃圾回收器,以及常见的和GC相关的性能调优参数. GC Roots 我们先来了解一下在Java中是如何判断一个对象的生死的,有些语言比如Pyth ...
- 深入理解JAVA虚拟机之JVM性能篇---垃圾回收
一.基本垃圾回收算法 1. 判断对象是否需要回收的方法(如何判断垃圾): 1) 引用计数(Reference Counting) 对象增加一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回 ...
- Java虚拟机垃圾回收(二) :垃圾回收算法(转载)
1.标记-清除算法 标记-清除(Mark-Sweep)算法是一种基础的收集算法. 1.算法思路 "标记-清除"算法,分为两个阶段: (A).标记 首先标记出所有需要回收的对象: 标 ...
- Java虚拟机(二):垃圾回收算法
一.介绍 GC(Garbage Collection),垃圾收集 Java中,GC的对象是堆空间和永久区 二.GC算法 1. 引用计数法 老牌垃圾回收算法 通过引用计算来回收垃圾 Java中未使用,使 ...
- JAVA虚拟机:内存回收策略及算法
java虚拟机中的程序计数器区.虚拟机栈区.本地方法栈区3个区域是随着线程的创建而创建,随着线程的结束而结束时,内存自然得到回收,所以这三个区域不需要过多考虑内存的回收问题. java虚拟机中的方法区 ...
- java虚拟机——垃圾回收机制
问题1:什么是垃圾回收机制? 在java的虚拟机当中,在我们进行实例化的时候,堆会给我们开辟新的空间存放实例.而由于堆,方法区是线程公有,不会像栈区(线程私有)一样随着线程的销毁而销毁.因此在java ...
- 垃圾回收相关(深入理解Java虚拟机中的内容)
程序计数器.虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收.垃圾回收主要是针对 Java 堆和方法区进行. 判断一个对 ...
- 【JVM从小白学成大佬】4.Java虚拟机何谓垃圾及垃圾回收算法
在Java中内存是由虚拟机自动管理的,虚拟机在内存中划出一片区域,作为满足程序内存分配请求的空间.内存的创建仍然是由程序猿来显示指定的,但是对象的释放却对程序猿是透明的.就是解放了程序猿手动回收内存的 ...
- Java虚拟机-------垃圾回收机机制
概述 jvm中的堆图 在了解 垃圾回收器 之前,首先得了解一下垃圾回收器的几个名词. 1. 吞吐量CPU 用于运行用户代码的时间与 CPU 总消耗时间的比值.比如说虚拟机总运行了 100 分钟,用户代 ...
随机推荐
- Re:从零开始教你使用 Sublime Text
目录 Re:从零开始教你使用 Sublime Text 0.前言 0-0.关于我为什么要写这篇文章 0-1.关于这篇文章会讲什么 0-2.适用人群 0-4.其他 0-5.无用的统计 1.安装和基础功能 ...
- 【CVE-2022-0543】Redis Lua沙盒绕过命令执行复现
免责声明: 本文章仅供学习和研究使用,严禁使用该文章内容对互联网其他应用进行非法操作,若将其用于非法目的,所造成的后果由您自行承担,产生的一切风险与本文作者无关,如继续阅读该文章即表明您默认遵守该内容 ...
- Java-ArrayList常用方法
数组的长度不可以发生改变. 但是ArrayList集合的长度是可以随意改变的. 对于ArrayList来说,有一个尖括号代表泛型. 泛型:也就是装在集合当中的所有元素,全都是统一的什么类型. 注意:泛 ...
- jdk线程池ThreadPoolExecutor优雅停止原理解析(自己动手实现线程池)(二)
jdk线程池工作原理解析(二) 本篇博客是jdk线程池ThreadPoolExecutor工作原理解析系列博客的第二篇,在第一篇博客中从源码层面分析了ThreadPoolExecutor在RUNNIN ...
- dd格式化硬盘
1. dd硬盘读写测速(不做实际读写): 测试纯写入性能 dd if=/dev/zero of=/dev/sdb bs=1M count=10240 oflag=direct 测试纯读取性能 dd i ...
- 痞子衡嵌入式:MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下高度灵活的FreeMarker链接文件模板机制. 痞子衡之前写过一篇文章 <MCUXpresso I ...
- Jmeter中通过V函数使Foreach控制器有多个输入变量
需求:Foreach 控制器只能有一个输入变量.但是实际情况会出现需要使用多个变量. 如:上一个接口获取到多个字段且每个字段用Json提取器获取的时候都是一个集合,期望将获取到的字段传给下一个接口. ...
- day15 Socket网络编程 & 反射
day15 知识点浅记一下 ping 使用来icmp来检查网络是否连通,并没有记录路径. tracert 使用icmp包记录并确定数据包访问目标所经过的路由,因此可以依据此命令判断故障发生的位置 n ...
- 【SQL基础】基础查询:所有列、指定列、去重、限制行数、改名
〇.建表数据 drop table if exists user_profile; CREATE TABLE `user_profile` ( `id` int NOT NULL, `device_i ...
- 【每日一题】【归并排序/堆排序&虚拟头结点】148. 排序链表-211220/220217【出栈时不断容易产生环状链表!】
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 . 进阶: 你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗? 方法1:归并排序+使用辅助函数 ...