IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JVM GC -> 正文阅读

[Java知识库]JVM GC

如何定位垃圾

  1. 引用计数 Reference Counting
    缺点:无法解决循环引用
  2. 可达性分析 Tracing GC(GC Root)

可以作为 GC Root 的对象

  1. JVM stack:Java 虚拟机栈(栈帧中的本地变量表)引用的对象
  2. native method stack:本地方法栈中引用的对象
  3. run-time constant:运行时常量池
  4. static references in method area:方法区中静态变量引用的对象

常见 GC 算法

  1. 标记清除 Mark-Sweep(老年代)
    缺点:内存不连续,产生碎片
  2. 拷贝算法 Copying (年轻代,98%朝生夕死)
    优点:内存连续,没有碎片
    缺点:空间开销高
  3. 标记整理 Mark-Compact(老年代)
    优点:没有碎片,不浪费空间
    缺点:效率偏低
算法移动对象空间开销时间开销
Mark-Sweep低(有碎片)mark 阶段与存活对象的数量成正比 O(L),sweep 阶段与整堆大小成正比 O(H)
Mark-Compact低(无碎片)mark 阶段与存活对象的数量成正比 O(L),compaction 阶段与存活对象的大小成正比 O(L)
Copying与存活对象大小成正比 O(L)

堆内存分代模型

新生代 + 老年代 + 永久代(1.7) / 元数据区(1.8) Meta Space
新生代 = eden + 2 * survivor

元数据区大小受限于物料内存
1.7 字符串常量存在永久代,1.8 存在堆

Eden : Survivor From : Survivor To = 8 : 1 : 1
新生代 : 老年代 = 1 : 2
在这里插入图片描述

年轻代回收过程

  1. YGC(Young GC)回收后,eden 大多数对象会被回收,存活的对象拷贝到 survivor 0
  2. 再次 YGC,eden + survivor 0 存活的对象拷贝到 survivor 1
  3. 再次 YGC,eden + survivor 1 拷贝到 survivor 0
  4. 每被复制一次,年龄 + 1,年龄超过 -XX:MaxTenuringThreshold 指定次数,进入老年代
    (Parallel Scavenge:15,CMS:6,G1:15)
  5. survivor 装不下,进入老年代

对象什么时候进入老年代?

对象头 mark word 有4位是记录对象年龄的,4位二进制最大是15,也就是说年龄最大为15

老年代回收

老年代满了进行FGC(Full GC),GC调优主要目的:尽量减少FGC

Minor GC = Young GC
Major GC = Full GC

java -XX:+PrintFlagsFinal:查看最终参数值
java -XX:+PrintFlagsInitial:查看默认参数值
java -XX:+PrintCommandLineFlags:查看命令行参数

垃圾回收器

  • 1.8 默认垃圾回收器:Parallel Scavenge + Parallel Old

在这里插入图片描述

Serial 应用在年轻代 串行回收

在这里插入图片描述

ParNew 并行回收 配合CMS的并行回收 年轻代

在这里插入图片描述

SerialOld

在这里插入图片描述

Parallel Scavenge 应用在年轻代 并行回收 重视吞吐量

吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)

ParallelOld

在这里插入图片描述

CMS 老年代 并行

垃圾回收和应用程序同时运行,降低STW时间(降低到200ms)

四个过程

  1. 初始标记:标记 GC Root 能直接关联的对象,会stw但时间短
  2. 并发标记:
  3. 重新标记:修正并发标记期间用户程序运行而变化的标记记录,会 STW 但时间较短
  4. 并发清除

三个缺点

  1. 占用 CPU 资源,默认开启垃圾回收线程数 = (CPU数 + 3) / 4,4核以上 CPU 会占用不少于 25% 的 CPU 资源
  2. 无法清理浮动垃圾(并发清理阶段用户程序新产生的垃圾,CMS 无法标记,只能留到下一次 CG 再清理)
  • 由于清理时用户程序还在运行,需要留一部分空间供并发收集时的程序运行使用,无法像其他回收器那样等到老年代快填满再触发收集,1.5 默认老年代 68% 触发收集,1.6 默认 92%,预留空间不足会出现 Concurrent Mode Failure 失败,性能降低
  • 解决方案:降低触发 CMS 的阈值,–XX:CMSInitiatingOccupancyFraction 92% 可以降低这个值,让 CMS 保持老年代足够的空间
  1. 基于标记-清除算法,产生空间碎片,-XX:+UseCMSCompactAtFullCollection 可以设置快要 FGC 前进行碎片整理,但停顿时间边长 -XX:CMSFullGCsBeforeCompaction 默认为0,指的是经过多少次 FGC 才进行压缩,当碎片化内存装不下其他对象时,会使用 Serial Old 进行标记整理

在这里插入图片描述

G1(10ms)不再进行物理分代,采用逻辑分代

  • 将内存分为一个个的 Region。一块 Region(分区)在逻辑上依然分代,分为四种:Eden,Old,Survivor,Humongous(大对象,跨多个连续的 Region)。
  • 它的每个分区都可能是年轻代也可能是老年代,但是在同一时刻只能属于某个代。
  • 可预测的停顿(分割堆成大小相等的多个 Region,追踪 Region 中垃圾堆积价值大小,维护优先级名单)
  • 首先回收垃圾最多的分区,花费较少的时间来回收这些分区的垃圾,这也就是 G1 名字的由来
  • 在回收老年代的分区时,是将存活的对象从一个分区拷贝到另一个可用分区,这个拷贝的过程就实现了局部的压缩。每个分区的大小从 1M 到 32M 不等,但都是2的幂次方。

在这里插入图片描述
在这里插入图片描述

MixedGC
-XX:InitiatingHeapOccupacyPercent,默认值45%,当堆内存超过这个值,触发MixedGC
回收时不分新生代还是老年代什么的,region满了就回收。

四个步骤

  1. 初始标记 STW
  2. 并发标记
  3. 最终标记 STW(重新标记)
  4. 筛选回收 STW(并行)
  • 跟 CMS 非常像,MixedGC 最后是筛选回收,多了个筛选步骤。筛选就是找出垃圾最多的 region。筛选后将存活对象复制到其他 region,再将之前的 region 清空。

CMS 与 G1 比较

在这里插入图片描述

三色标记算法

  • 白色:该对象没有被标记过。(对象垃圾)
  • 灰色:该对象已经被标记过了,但该对象下的属性没有全被标记完。(GC需要从此对象中去寻找垃圾)
  • 黑色:该对象已经被标记过了,且该对象下的属性也全部都被标记过了。(程序所需要的对象)
    在这里插入图片描述

三色标记存在问题

  1. 浮动垃圾:并发标记的过程中,若一个已经被标记成黑色或者灰色的对象,突然变成了垃圾,由于不会再对黑色标记过的对象重新扫描,所以不会被发现,那么这个对象不是白色的但是不会被清除,重新标记也不能从 GC Root 中去找到,所以成为了浮动垃圾,浮动垃圾对系统的影响不大,留给下一次GC进行处理即可。
  2. 对象漏标问题(需要的对象被回收):并发标记的过程中,一个业务线程将一个未被扫描过的白色对象断开引用成为垃圾(删除引用),同时黑色对象引用了该对象(增加引用)(这两部可以不分先后顺序);因为黑色对象的含义为其属性都已经被标记过了,重新标记也不会从黑色对象中去找,导致该对象被程序所需要,却又要被GC回收。

在这里插入图片描述
当且仅当一下两个条件同时满足时,会产生对象消失的问题

  1. 赋值器删除了全部从灰色对象到白色对象的直接或间接引用
  2. 赋值器插入了一条或多条从黑色对象到白色对象的新引用

所以要解决漏标问题,打破两个条件之一即可:

  • CMS:增量更新 Incremental Update,跟踪黑指向白的增加,破坏条件2
    当黑色对象插入新的指向白色对象的引用关系时,将这个新插入的引用记录下来,等到并发扫描结束后,再将记录过引用关系中的黑色对象为根,重新扫描。
    简化理解为:黑色对象一旦插入指向白色对象的引用,它就变回灰色对象了

  • G1:原始快照 Snapshot At The Beginning SATB,记录灰指向白的消失,破坏条件1
    当灰色对象要删除指向白色对象的引用关系时,就把这个要删除的引用记录下来,并发扫描结束后,再将这些记录过引用关系的灰色对象为根,重新扫描一遍。
    简化理解为:当灰->白消失时,要把这个 引用 推到 GC 的堆栈,保证白还能被 GC 扫描到

为什么G1采用SATB而不用incremental update?

因为采用incremental update把黑色重新标记为灰色后,之前扫描过的还要再扫描一遍,效率太低。

Incremental Update 并发标记漏标的问题

在这里插入图片描述
CMS通过重新扫描一遍解决了上述问题

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-07 13:35:18  更:2022-02-07 13:36:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:49:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码