当前位置: 首页 > news >正文

JVM -垃圾回收器

本人在这篇文章中讲解了垃圾回收机制,这为前置知识

美团一面面经:Threadlocal(线程局部变量的原理)->内存泄漏问题->垃圾回收机制_threadlocal回收-CSDN博客

首先对前置知识漏洞做一个补充:java的引用类型

  1. 强引用:被仍一GC Roots对象【强引用】的对象,该对象都不会被垃圾回收

     

    User user=new User();

  2. 软引用:仅有软引用该对象时,在垃圾回收后,如果内存仍不足会再次触发垃圾回收
    User user=new User();
    SoftReference softReference =new SoftReference (user)

  3. 弱引用:仅有弱引用该对象时,垃圾回收无论内存是否充足都会回收弱引用对象,需要配合SoftReference(软引用)使用。此时就是ThreadLocal内存泄漏的原因
    User user=new User();
    WeakReference weakReference=new WeakReference(user)

  4. 虚引用:必须配合引用队列使用,被引用对象回收时,会将虚引用入队,由Reference Handler线程调用虚引用相关方法释放直接内存

JVM 有哪些垃圾回收器?

  1. 串行垃圾收集器
  2. 并行垃圾收集器
  3. CMS(并发)垃圾收集器
  4. G1垃圾收集器

串行垃圾收集器

Serial和Serial Old串行垃圾收集器,是指使用单线程进行垃圾回收,堆内存较小,适合个人电脑

  1. Serial 作用于新生代,采用复制算法
  2. Serial Old作用与老年代,采用标记-整理算法

垃圾回收时,只有一个线程在工作,并且java应用中的所有线程都要暂停(STW),等待垃圾回收的完成

一个线程进行垃圾回收其他线程阻塞

并行垃圾收集器

Parallel New和Parallel Old是一个并行垃圾回收器,JDK8默认使用此垃圾回收器

  1. Parallel New作用于新生代,采用复制算法
  2. Parallel Old作用于老年代,采用标记-整理算法

在进行垃圾回收的时候,所有线程都要进行暂停(STW),等待垃圾回收的完成

多个线程同时进行垃圾回收

CMS(并发)垃圾收集器

CMS是使用标记-清除算法的、仅仅针对老年代的垃圾回收器。

1.以最短回收停顿时间为目标的收集器、停顿时间短

2.进行垃圾回收时,应用任然能正常运行

 

1.初始化阶段,指挥标记与GCRoots之间关联的A。(找出GCRoots之间引用的节点)

2.并发标记的时候,会根据引用链路标记B、C、D(根据引用链路标记节点)

3.重新标记阶段,因为初始化阶段和并发标记阶段中其他线程都是可以运行的,所以就会存在漏标记的问题。在此期间,如果X被引用了,那么重新标记会标记X,如果D或者B没有被引用了也会取消对应的标记。(最后检查在此期间是否有其他线程引用了新节点或者取消了新节点的引用)

4.并发清理

G1垃圾回收器

1.应用于新生代和老年代,JDK9的默认回收器

2.划分多个区域,每个区域都可以充当eden区,survivor,old,humongous,其中humongous转为大对象准备

3.采用复制算法

4.并发失败会触发Full GC

5.分为三个阶段:新生代回收、并发标记、混合收集

1.年轻代垃圾回收

  1. 初始时,所有区域都处于空闲状态
  2. 创建了一些对象,跳出一些空闲区域作为伊甸园区存储这些对象
  3. 当伊甸园需要垃圾回收时,跳出一个空闲区域作为幸存区,用复制算法复制存活对象,需要暂停用户线程
  4. 随着时间流逝,伊甸园的内存又有不足
  5. 将伊甸园以及之前心存区中的存活对象,采用复制算法,复制到新的幸存区,其中较老对象晋升至老年代

2.年轻代垃圾回收+并发标记

当老年代占用内存超过阈值(默认45%)后触发并发标记,这是无需暂停用户线程

1.并发标记之后,会有重新标记阶段解决漏标问题,此时需要暂停用户线程

2.这些都完成后就知道了老年代有哪些存活对象,随后进入混合收集阶段。此时不会对所有老年代区域进行回收,而是根据暂停时间目标 优先回收价值高(存活对象少)的区域

混合垃圾回收

混合收集阶段中,参与复制的有 eden、survivor、old

这次回收中:

1.eden区和s区的垃圾回收都将存活对象放入新的S区中

2.s区中到达阈值的存货对象和old区占用内存超过45%的经过GC后的存货对象放入新的O区中

复制完成,内存得到释放。进入下一轮的新生代回收、并发标记、混合收集

一个对象如果太大了会存入一个巨型对象中,一个区域装不下,会分配连续的区域进行存储

文章部分图片来自互联网收集

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ceph如何增删改查的管理文件
  • PostgreSQL的pg_dump测试
  • 基于springboot的校园失物招领系统--论文pf
  • Nginx+Tomcat实现负载均衡、动静分离集群部署
  • 无人机随车飞行技术详解
  • 矩阵快速幂优化状态机dp,LeetCode 552. 学生出勤记录 II
  • redis学习笔记——redis中的常见数据类型以及相关命令
  • Java基础——IService.class 中查询数据方法list() 源码剖析及使用
  • 《区块链与监管合规:在创新与规范之间寻求平衡》
  • 基于ssm+vue+uniapp的二手物品交易平台小程序
  • Linux安装MQTT 服务器(图文教程)
  • Swift 基本语法
  • 【算法】dfs转dp的通用方式
  • Python 办公自动化 处理 Excel 数据 【1】推荐
  • 设计模式实战:即时通讯应用的设计与实现
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • crontab执行失败的多种原因
  • Facebook AccountKit 接入的坑点
  • Git 使用集
  • gops —— Go 程序诊断分析工具
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Object.assign方法不能实现深复制
  • PHP变量
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • React-flux杂记
  • SOFAMosn配置模型
  • vue数据传递--我有特殊的实现技巧
  • windows下使用nginx调试简介
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 记录:CentOS7.2配置LNMP环境记录
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 设计模式(12)迭代器模式(讲解+应用)
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 《天龙八部3D》Unity技术方案揭秘
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​【已解决】npm install​卡主不动的情况
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (06)Hive——正则表达式
  • (07)Hive——窗口函数详解
  • (70min)字节暑假实习二面(已挂)
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (分类)KNN算法- 参数调优
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (四)模仿学习-完成后台管理页面查询
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)大型网站的系统架构