JVM 辣鸡回收
垃圾回收算法
标记清除法
先标记出需要回收的对象,然后一次性回收。缺点:会产生内存碎片,并且效率也不高。
标记压缩法
先标记出需要回收的对象,然后让存活对象向一端移动,移动的过程中进行回收辣鸡。避免了内存碎片问题。
复制算法
把内存划分出相等的两块,每次只用其中一块。当一块用完了,就将还存活的对象移动到另一块内存上,然后把辣鸡清理掉。内存分配不用来考虑碎片问题,只需要顺序分配即可。缺点:总有一块内存闲着没事干。
为了形象生动可爱,我画了个图

..
垃圾回收器
串行收集器

串行辣鸡收集器只用一个单线程做所有工作,其内存占用空间大小也是所有辣鸡收集器里最低的。
- 新生代辣鸡回收使用复制算法
- 老年代使用标记压缩算法
并行收集器

并行收集器相对于串行收集器,使用了多线程来完成辣鸡回收的工作,但是同样也需要Stop-The-World。新生代和老年代的回收都是并行的。
(历史:刚引入的时候,新生代使用多线程,而老年代则是单线程进行辣鸡回收。随着堆的尺寸和老年代对象的数量和大小不断增长,老年代辣鸡回收的时间不断变长,增加了一个多线程的老年代收集器和多线程的新生代收集器同时使用的方式,由此得到了增强的并行辣鸡收集器)
- -XX:+UseParallelGC 新生代使用并行收集器,老年代使用串行收集器
- -XX:+UseParallelOldGC 新生代和老年代都使用并行收集器
- 新生代使用复制算法
- 老年代使用标记压缩算法
CMS收集器(Concurrent Mark Sweep)

在CMS辣鸡回收中,新生代的回收与并行辣鸡收集器很类似。它们是多线程的并且会使应用程序线程暂停。主要区别在于老年代的收集上。
CMS做辣鸡回收的时候与应用线程同时进行,除了少数的相对短暂的GC同步暂停,可以说是大多数情况是并发进行的。
CMS老年代收集活动从初始标记开始,这个阶段标记根可以直接关联到的对象,这个阶段是要暂停应用线程的。之后进入并发标记阶段,这个阶段标记所有对象,和应用线程一同运行。接着,进入重新标记阶段,这个阶段主要处理初始标记,并发标记过程中可能错过的对象,这个阶段是要暂停应用线程的。最后,并发清除启动,释放所有死亡对象所占用的空间。
- 挑战1:要在应用消耗完Java的可用堆之前完成并发收集工作,因此选择一个合适的时机来启动这个并发收集工作尤为重要。
- 挑战2:处理老年代中的空间碎片。如果老年代中空间碎片太小,无法容纳刚晋升上来的对象,因为CMS并发收集循环中并不执行压缩,所以可能导致CMS回过来使用串行GC,触发一次full收集,导致一个漫长的暂停。
- 老年代主要使用标记清除算法。清理碎片显得很重要。
- -XX:+UseCMSCompactAtFullCollection 垃圾收集完成后,进行一次内存碎片整理
- -XX:CMSFullGCsBeforeCompaction 回收一定次数后,压缩一次内存
JDK 8中两个主要的并发收集器:
并发标记扫描(CMS)收集器:此收集器适用于喜欢较短垃圾收集暂停且可以与垃圾收集共享处理器资源的应用程序。
Garbage-First垃圾收集器:这种服务器式收集器适用于具有大内存的多处理器机器。它以高概率满足垃圾收集暂停时间目标,同时实现高吞吐量。
G1收集器(Garbage First)
G1把Java堆拆成一系列分区,这样的话,在某一个时间段内,大部分辣鸡回收只在一个区内而不是整个堆中进行。区域大小可以从1 MB到32 MB不等,具体取决于堆大小。目标是不超过2048个分区。伊甸区,幸存区和老年代是这些地区的逻辑集合,并不是连续的。
一个新概念:新生代不再是一个连续内存块,一个分区既可以变成新生代,也可以变成老年代。
堆被划分为一组大小相同的堆区域,每个区域都是一个连续的虚拟内存区域。G1执行一个并发全局标记阶段,以确定整个堆中对象的活性。
标记阶段完成后,G1知道哪些区域大部分是空的。它首先收集这些区域,这通常会产生大量的自由空间。这就是为什么这种垃圾收集方法被称为Garbage-First。
G1将对象从堆的一个或多个区域复制到堆上的单个区域,并且在此过程中压缩并释放内存。这个过程是多线程执行,以减少暂停时间并提高吞吐量。因此,随着每次垃圾收集,G1不断努力减少碎片。这超出了以前两种方法的能力->CMS(Concurrent Mark Sweep)垃圾收集不进行压缩。并行压缩仅执行整堆压缩,这会导致相当长的暂停时间。

所有Eden区+幸存区=新生代
..

新生代的收集和前面的没啥区别,都要暂停应用线程。老年代比CMS的老年代收集还要与众不同。↓↓
一个G1并发周期包含:初始标记、并发根分区扫描、并发标记、重新标记和清除。
在G1中,一旦达到内存堆的占用阈值[yu zhi],一次并发stop-the-world方式的初始标记阶段就会被安排执行,在此阶段标记所有GC根,根是对象图的起点。这个阶段会跟着下一次新生代收集同时进行。然后进入并发根分区扫描,扫描和跟踪survivor分区里所有对象的引用,唯一的限制是在下一次GC前必须先完成扫描,因为一次新的GC会产生一个新的存活对象集合,它跟初始标记的存活对象是有区别的。
然后进入并发标记阶段,标记老年代中所有存活对象。当并发标记阶段结束,并行stop-the-world的重新标记阶段就被启动,标记那些因为在标记阶段同时执行的应用线程导致产生的错过的对象。重新标记结束,就执行清除阶段,优先回收没有任何存活对象的分区,然后把每个收集过辣鸡的分区中的存活对象转移到一个可用分区中,一旦存活对象被转移,那么这个分区(新生代或者老年代)就可以被回收为可用分区。
G1最大的暂停时间来源于 新生代收集和混合收集(新生代和老年代一起)
JVM 辣鸡回收的更多相关文章
- GO的GC辣鸡回收(一)
用户程序通过内存分配器(Allocator)在堆上申请内存,而垃圾收集器(Collector)负责回收堆上的内存空间,内存分配器和垃圾收集器共同管理程序中的堆内存空间. 基本概念 垃圾分类 语义垃圾: ...
- JVM的垃圾回收机制详解和调优
JVM的垃圾回收机制详解和调优 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都 ...
- jvm的垃圾回收算法
一.对象存活判断判断对象是否存活一般有两种方式:1.引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收.此方法简单,无法解决对象相互循环引用的问题.2 ...
- 03 JVM的垃圾回收机制
1.前言 理解JVM的垃圾回收机制(简称GC)有什么好处呢?作为一名软件开发者,满足自己的好奇心将是一个很好的理由,不过更重要的是,理解GC工作机制可以帮助你写出更好的Java程序. 在学习GC前,你 ...
- JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)
相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技术 ...
- jvm详情——3、JVM基本垃圾回收算法回收策略
JVM基本垃圾回收算法回收策略 引用计数(Reference Counting):比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收集计数为0的 ...
- 扒一扒JVM的垃圾回收机制,下次面试你准备好了吗
相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋. 一. 技 ...
- JVM的垃圾回收机制
JVM的垃圾回收机制:(GC通过确定对象是否被活动对象引用来确定是否收集该对象.) 1.触发GC(Garbage Collector)的条件. (1.GC在优先级最低的线程中运行,在未运行的线程中进行 ...
- Java技术专题之JVM逻辑内存回收机制研究图解版
一.引言 JVM虚拟机内存回收机曾迷惑了不少人,文本从JVM实现机制的角度揭示JVM内存回收的原理和机制. 一.Java平台逻辑架构 二.JVM物理结构 通过从JVM物理结构图我们可以看到: 1.JV ...
随机推荐
- C# 中那些常用的工具类(Utility Class)(三)
今天来接着写这个系列的文章,这一篇主要是用来介绍关于C#中的XML序列化的问题,这个相信大家一定会经常使用它,特别是在WPF中,有时候我们需要将我们后台的数据保存在数据库中,从而在软件下一次启动的时候 ...
- PHP金额工具类之将阿利伯数字转换为大写中文数字
1.将阿拉伯数字转换为中文大写数字 <?php namespace core\components; class PriceHelper extends \yii\base\Component{ ...
- 一个实际的案例介绍Spring Boot + Vue 前后端分离
介绍 最近在工作中做个新项目,后端选用Spring Boot,前端选用Vue技术.众所周知现在开发都是前后端分离,本文就将介绍一种前后端分离方式. 常规的开发方式 采用Spring Boot 开发项目 ...
- WhiteHat Contest 11 : re1-100
ELF文件,运行一下是要求输密码 die查了一下无壳 直接拖入ida 可以发现 这是它的判断函数 也就是说输入的总长度是42位第一个字符是123也就是0x7b 也就是'{'然后10位是"53 ...
- github---无命令可视化界面操作
最近工作需要,研究了一下git,这个东西挺实用,给我的感觉并不是那么简单使用,我认为还可以再深入的研究一下,挺好玩的~ 说一下我的学习路线: 1.先看的廖老师的博客:https://www.liaox ...
- oracle逗号分隔函数
SELECT wm_concat(GZTYPE) str FROM TB_FDN_WORKKIND
- Play framework框架中通过post方式发送请求
搞了好久这个最终还是在play官方文档中看见的发送请求的方式,国内好像很少有使用这个框架的,加之自己不是太愿意宣传,好东西总归是好东西,不说废话了. 在play中发送请求有两种常用的方式,一种get, ...
- maven 当两个工程合并后 他的classpath也合并了
maven 当两个工程合并后 他的classpath也合并了 也就是说资源文件环境合并了
- bzoj4152-[AMPPZ2014]The_Captain
Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. Input 第一行包含一个正整数n(2 ...
- Girls and Boys HDU - 1068 二分图匹配(匈牙利)+最大独立集证明
最大独立集证明参考:https://blog.csdn.net/qq_34564984/article/details/52778763 最大独立集证明: 上图,我们用两个红色的点覆盖了所有边.我们证 ...