首页 > 其他分享 >jvm-第四节垃圾回收器的细节实现

jvm-第四节垃圾回收器的细节实现

时间:2023-06-27 18:02:04浏览次数:29  
标签:标记 回收 XX 线程 垃圾 jvm gc 第四节

垃圾回收器串讲及 HostSpot 的细节实现

本篇知识点概况

  1. 并发标记与三色标记
  2. gc并发下漏标问题与不同垃圾回收期下的处理方案(G1,Cms对比)
  3. 跨代引用
  4. 安全点与安全区域
  5. gc参数(了解)
  6. 其他的垃圾回收期(了解)

并发标记与三色标记

  1. 三色标记诞生的历史:在三色标记之前有一个标记清除算法,根据可达性,可达设置为1,不可达设置为0,都完事之后统一清理,但是不能异步,所以stw时间较长,对于要求实时性的系统不可接受便有了可以异步的三色标记
  2. 三色标记的概念:三色分别是黑 灰 白,支持并发
  1. 黑色:跟对象,且它所有的引用都已经扫描
  2. 灰色:本身被扫描,但引用的对象没有扫描完
  3. 白色:未被扫描

gc并发下漏标问题与不同垃圾回收期下的处理方案(G1,Cms对比)

  1. 三色标记漏标问题:原因是并发扫描过程中,引用发生变化,以下面三张图为例
  1. 下面的图讲述扫描时引用发生了变化
  1. 如何解决这个漏标问题,下面分别是cms与g1中解决方法
  1. cms解决漏标之incremental update:当一个白色对象被一个黑色对象引用,将黑色标记为灰色,重新扫描;
  2. g1解决漏标之satb:stab既快照,当一个对象被修改后,会进行标记,然后颜色改成灰色,并在下次回收的时候进行处理,标记为黑色

跨代引用

  1. 跨代引用的问题:堆分为新生代,老年代,如果老年代对象引用了新生代对象,新生代回收就要扫描整个老年代,开销太大,
  2. 解决方法1-记忆集:rset,相当于一个位图记录,新生代,老年代之间的引用关系,可以避免扫描整个老年代
  3. 解决方法2-cardTable:是一种记录堆内存区域是否被修改的数据结构,按页划分表格,记录被修改的页,垃圾回收时只扫描dirty的页,避免全盘扫描

安全点与安全区域

  1. 安全点作用:所有线程进入安全点,用户线程暂停,gc线程开始工作
  2. 什么是安全点:比如方法调用,循环跳转,异常跳转,一般这些指令才会产生安全点,用户线程在执行过程中会不断轮训这个安全点,如果发现为true就在最近的安全点上主动挂起
  3. 安全区域的作用:所有线程进入安全点,用户线程暂停,gc线程开始工作;代码在这段区域中对象引用关系不会发生变化;其次是如果线程一直sleep,block,程序是无法进入安全点的,
  4. 什么是安全区域:举个例子 sychronized
private static Selector selector;

private static void processRequests() {
    // 进入安全区域
    synchronized(selector) {
        // 在安全区域内进行 I/O 操作
        selector.select();
        // 处理 I/O 事件
        Set<SelectionKey> selectedKeys = selector.selectedKeys();
        Iterator<SelectionKey> keyIterator = selectedKeys.iterator();
        while(keyIterator.hasNext()) {
            SelectionKey key = keyIterator.next();
            if(key.isAcceptable()) {
                // 处理连接请求
            } else if (key.isReadable()) {
                // 处理读事件
            } else if (key.isWritable()) {
                // 处理写事件
            }
            keyIterator.remove();
        }
    }
    // 离开安全区域,进行其他计算
    // ...
}

gc参数(了解)

  1. 上面是一条gc日志
  2. gc常用参数
GC 常用参数
-Xmn -Xms -Xmx –Xss 年轻代 最小堆 最大堆 栈空间
-XX:+UseTLAB 使用 TLAB,默认打开
-XX:+PrintTLAB 打印 TLAB 的使用情况
-XX:TLABSize 设置 TLAB 大小
-XX:+DisableExplicitGC 启用用于禁用对的调用处理的选项 System.gc() -XX:+PrintGC 查看 GC 基本信息
-XX:+PrintGCDetails 查看 GC 详细信息
-XX:+PrintHeapAtGC 每次一次 GC 后,都打印堆信息
-XX:+PrintGCTimeStamps 启用在每个 GC 上打印时间戳的功能
-XX:+PrintGCApplicationConcurrentTime 打印应用程序时间(低) -XX:+PrintGCApplicationStoppedTime 打印暂停时长(低)
-XX:+PrintReferenceGC 记录回收了多少种不同引用类型的引用(重要性低)
-verbose:class 类加载详细过程
-XX:+PrintVMOptions 可在程序运行时,打印虚拟机接受到的命令行显示参数
-XX:+PrintFlagsFinal -XX:+PrintFlagsInitial 打印所有的 JVM 参数、查看所有 JVM 参数启动的初始值(必须会用)
-XX:MaxTenuringThreshold 升代年龄,最大值 15, 并行(吞吐量)收集器的默认值为 15,而 CMS 收集器的默认值为 6。 Parallel 常用参数
-XX:SurvivorRatio 设置伊甸园空间大小与幸存者空间大小之间的比率。默认情况下,此选项设置为 8
-XX:PreTenureSizeThreshold 大对象到底多大,大于这个值的参数直接在老年代分配
-XX:MaxTenuringThreshold 升代年龄,最大值 15, 并行(吞吐量)收集器的默认值为 15,而 CMS 收集器的默认值为 6。
-XX:+ParallelGCThreads 并行收集器的线程数,同样适用于 CMS,一般设为和 CPU 核数相同
-XX:+UseAdaptiveSizePolicy 自动选择各区大小比例
CMS 常用参数
-XX:+UseConcMarkSweepGC 启用 CMS 垃圾回收器
-XX:+ParallelGCThreads 并行收集器的线程数,同样适用于 CMS,一般设为和 CPU 核数相同

其他的垃圾回收器(了解)

  1. 传统的垃圾回收期:内存占用,吞吐量,延时只能满足俩,而 现在延时这个指标越来越重要,就有了低延迟垃圾回收器
Eplison(了解即可)
这个垃圾回收器不能进行垃圾回收,是一个“不干活”的垃圾回收器,由 RedHat 退出,它还要负责堆的管理与布局、对象的分配、与解释器
的协作、与编译器的协作、与监控子系统协作等职责,主要用于需要剥离垃圾收集器影响的性能测试和压力测试。
ZGC(了解即可)
有类似于 G1 的 Region,但是没有分代。
标志性的设计是染色指针 ColoredPointers(这个概念了解即可),染色指针有 4TB 的内存限制,但是效率极高,它是一种将少量额外的信息存储在指针上
的技术。
它可以做到几乎整个收集过程全程可并发,短暂的 STW 也只与 GC Roots 大小相关而与堆空间内存大小无关,因此考科一实现任何堆空间 STW 的时间小于
十毫秒的目标。
Shenandoah(了解即可)
第一款非 Oracle 公司开发的垃圾回收器,有类似于 G1 的 Region,但是没有分代。
也用到了染色指针 ColoredPointers。
效率没有 ZGC 高,大概几十毫秒的目标

问题

  1. 垃圾回收器 从cms到g1发展中的变化,比如针对漏标部分的处理,针对跨代引用的处理;
  2. 安全点和安全区域的区别


标签:标记,回收,XX,线程,垃圾,jvm,gc,第四节
From: https://blog.51cto.com/u_12550160/6564791

相关文章

  • jvm-第四节垃圾回收器的细节实现
    #垃圾回收器串讲及HostSpot的细节实现本篇知识点概况并发标记与三色标记gc并发下漏标问题与不同垃圾回收期下的处理方案(G1,Cms对比)跨代引用安全点与安全区域gc参数(了解)其他的垃圾回收期(了解)并发标记与三色标记三色标记诞生的历史:在三色标记之前有一个标记清除算法......
  • 垃圾回收与算法
    如何确定垃圾1、引用计数法:在Java中,引用和对象是有关联的,如果要操作对象则必须用引用进行。因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说,即一个对象如果没有任何与之关联的引用,即他们的引用计数都不为0,则说明对象不太可能再被用到,那么这个对象就是可......
  • JVM中的-Xms 、-Xmx 参数该如何设置
    在Java虚拟机(JVM)中,-Xms和-Xmx都是用来设置JVM堆内存大小的参数。其中,-Xms用于设置JVM启动时分配的初始堆内存大小,而-Xmx用于设置JVM堆内存的最大可用空间。默认情况下,-Xms参数的值为物理内存的1/64,-Xmx参数的值为物理内存的1/4。在设置这两个参数时,需要根据具体应......
  • JVM 类加载机制
    加载过程其中验证,准备,解析合称链接加载通过类的完全限定名,查找此类字节码文件,利用字节码文件创建Class对象.验证确保Class文件符合当前虚拟机的要求,不会危害到虚拟机自身安全.准备进行内存分配,为static修饰的类变量分配内存,并设置初始值(0或null).不包含final修饰的静态......
  • 新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?
    在Java虚拟机中,主要存在两个代(Generation)的垃圾回收器:新生代(YoungGeneration)垃圾回收器和老年代(OldGeneration)垃圾回收器。它们的作用和区别如下:新生代垃圾回收器:新生代是存放新创建的对象的内存区域,一般占整个堆内存的较小部分。新生代垃圾回收器主要负责回收新生代内存区域中的......
  • 智慧垃圾分类大数据可视化监管系统
    前言随着城市化进程的不断加快和居民生活水平的日益提高,城市生活垃圾产生量亦在与日剧增。建设背景随着城镇化进程加速、人民生活水平持续提升,城市生活垃圾产生量也在逐年增长。生活垃圾是“放错地方的资源”,能否处理好这些“放错地方的资源”,关系着城乡人居生态环境,综合处理、......
  • 智慧垃圾分类大数据可视化监管系统
    前言随着城市化进程的不断加快和居民生活水平的日益提高,城市生活垃圾产生量亦在与日剧增。建设背景随着城镇化进程加速、人民生活水平持续提升,城市生活垃圾产生量也在逐年增长。生活垃圾是“放错地方的资源”,能否处理好这些“放错地方的资源”,关系着城乡人居生态环境,综合处......
  • JVM_简介
    1.JVM_体系JVM组成部分1.类加载器2.运行时数据区3.执行引擎4.本地方法库JVM执行流程1.类加载器把Java代码转换为字节码2.运行时数据区把字节码加载到内存中,不能直接交给底层系统去执行3.执行引擎将字节码翻译为底层系统指令,再交由CPU去执行4.CPU执行,调用其他语言的本......
  • JVM参数如何配置
    应用服务器配置示例-server-Xmx4g-Xms4g-Xmn256m-XX:PermSize=128m-Xss256k-XX:+DisableExplicitGC-XX:+UseConcMarkSweepGC-XX:+CMSParallelRemarkEnabled-XX:+UseCMSCompactAtFullCollection-XX:LargePageSizeInBytes=128m-XX:+UseFastAccessorMethods-XX:+UseCM......
  • 垃圾识别系统Python+TensorFlow+Django+卷积神经网络算法【完整代码系统】
    一、介绍垃圾识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对5种垃圾数据集进行训练,最后得到一个识别精度较高的模型。并基于Django,开发网页端操作平台,实现用户上传一张垃圾图片识别其名称。二、效果展示三、演示视频+代码视......