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

jvm之垃圾回收器

分类

  • 按线程
    • 串行
    • 并行
  • 工作模式
    • 并发式
    • 独占式
  • 碎片处理方式
    • 压缩式
    • 非压缩式
  • 工作内存空间
    • 年轻代
    • 老年代

评估GC的性能指标

  • 吞吐量:运行用户代码的时间占总运行时间的比例
  • 暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间
  • 内存占用: java堆区所占的内存大小

垃圾回收器

  • Serial
    • 回收年轻代
    • 采用复制算法、串行回收和“Stop-the-world”机制的方式执行内存回收
    • 优势
      • 简单而高效(在单线程比),比较适合单CPU
    • 使用场景
      • 可用内存一般不大,可以在较短时间内完成垃圾收集,只有不频繁发生,使用串行回收器是可以接受的
    • 使用-XX:+UseSerialGC 参数可以指定年轻代和老年代都使用串行收集器
      • 等价于 新生代使用 Serial GC,且老年代使用Serial Old GC
  • Serial Old
    • 回收老年代
    • 采用了串行回收和“stop the world”机制,只不过内存回收算法使用的是标记-压缩算法
      • Serial Old是运行在Client模式下默认的老年代的垃圾回收器
      • Serial Old在server模式下主要有两个用途
        • 与新生代的Parallel Scavenge配合使用
        • 作为老年代的CMS收集器的后备垃圾收集方案
  • ParNew
    • 回收年轻代
    • 采用复制算法、串行回收和“Stop-the-world”机制的方式执行内存回收
  • Parallel Scavenge
    • 回收年轻代
    • 采用复制算法、串行回收和“Stop-the-world”机制的方式执行内存回收
    • 可控制吞吐量
    • 自适应调节策略
    • 搞吞吐量可以高效率的利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。常见案例
      • 批量处理
      • 订单处理
      • 工资支付
      • 科学计算
    • 参数配置
      • -XX:+UseParallelGC 手动指定年轻代使用parallel并行收集器执行内存回收任务
      • -XX:+UseParallelOldGC: 手动指定老年代都是使用并行回收收集器。
        • 分别适用于新生代和老年代。默认jdk8是开启的
        • 上面两个参数,默认开启一个,另一个也会被开启
      • -XX:ParallelGCThreads 设置年轻代并行收集器的线程数。一般地,最好与CPU数量相等,以避免过多的线程数影响垃圾收集性能
        • 在默认情况下,当CPU数量小于8个,ParallelGCThreads 的值等于CPU数量
        • 当CPU数量大于8个,ParallelGCThreads 的值等于 3+ [5*CPU]/8
      • -XX:MaxGCpauseMillis 设置垃圾收集器最大停顿时间。毫秒
      • -XX:GCTimeRatio 垃圾收集时间占总时间的比例(=1/(N+1))。用于衡量吞吐量的大小
        • 默认值 99 (0,100)
      • -XX:+UseAdaptiveSizePolicy 设置Parallel Scavenge 收集器具有自适应调节策略
        • 在这种模式下,年轻代的大小、eden和survivor的比例、晋升老年代的对象年龄等参数会被自动调整,已达到在堆大小、吞吐量和停顿时间之间的平衡点
        • 在手动调优比较困难的场合,可以直接使用这种自适应的方式,仅指定虚拟机的最大堆、目标的吞吐量和停顿时间,让虚拟机自己完成调优工作
  • Parallel Old
    • 回收老年代
    • 标记压缩算法
    • 并行回收
    • stop-the-world机制
  • CMS
    • 回收老年代
    • 低延迟、并发
    • 标记清除算法
    • stop-the-world
    • 工作过程
      • 初始标记
        • 所有的工作线程会stw,这个阶段的主要任务仅仅是标记出GC Roots能直接关联到的对象。一旦标记完成之后就会恢复之前被暂停的所有应用线程。由于直接关联对象比较小,所以速度非常快
      • 并发标记
        • 从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行
      • 重新标记
        • 由于在并发标记阶段中,程序的工作线程会和垃圾收集线程同时运行,因此为了修正并发标记期间,因用户线程继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间通常会比初始标记阶段稍长一些,但也远比并发标记阶段的时间短
      • 并发清除
        • 此阶段清理删除掉标记阶段判断的已经死亡的对象,释放内存空间
    • 垃圾回收时机
      • 不能等到内存不足才进行回收,因为回收和用户线程是并发执行的,需要设置一定的阈值,便开始进行回收,要是CMS运行期间预留的内存无法满足程序的需求,就会出现“Concurrent Mode Failure”失败,这是jvm启动预备方案,临时使用Serial Old收集器来重新进行老年代的垃圾收集,这样停顿时间就长了
    • 优点:
      • 并发收集
      • 低延迟
    • 缺点
      • 会产生碎片
      • 对CPU资源非常敏感
        • 在并发阶段,虽然不会导致用户停顿,但会因为占用了一部分线程而导致应用程序变慢,总吞吐量会降低
      • 无法处理浮动垃圾
        • 并发标记如果产生新的垃圾对象,CMS将无法对这些垃圾对象进行标记,最终会导致这些新产生的垃圾对象没有被及时回收
    • 为什么要重新标记
      • 一个本应该不是垃圾的对象被视为了垃圾
      • 增量更新是站在新增引用的对象的角度来解决问题。所谓增量更新,就是在赋值操作之前添加一个写屏障,在写屏障中记录新增的引用。比如,用户线程要执行:A.f = F;那么在写屏障中将新增的这个引用关系记录下来。标准的描述就是,当黑色对象新增一个白色对象的引用时,就通过写屏障将这个引用关系记录下来。然后在重新标记阶段,再以这些引用关系中的黑色对象为根,再扫描一次,以此保证不会漏标。
    • 常用参数
      • -XX:+UseConcMarkSweepGC 手动指定使用CMS
      • -XX:CMSInitiatingOccupanyFraction 设置堆内存使用率的阈值,一旦达到该阈值,便可以进行回收
      • -XX:+UseCMSCompactAtFullCollection 用于指定在执行完Full GC对内存空间进行压缩整理,以此避免内存碎片的产生。
      • -XX:CMSFullGCsBeforeCompaction 设置在执行多少次Full GC后对内存空间进行压缩整理
      • -XX:ParallelCMSThreads 设置CMS的线程数量
  • G1
    • 整堆
    • 特点
      • 并行与并发
        • 并行性:G1在回收期间,可以有多个GC线程同时工作,有效利用多核计算能力。此时用户线程stw
        • 并发性:G1拥有与应用程序交替执行的能力,部分工作可以和应用程序同时执行,因此,一般来说,不会在整个回收阶段发生完全阻塞应用的情况
      • 分代收集
        • 会区分年轻代和老年代,年轻代依然有eden区和s区。但从堆的结构上看,它不要求整个eden区、年轻代或者老年代都是连续的,也不再坚持固定大小和固定数量
        • 将堆空间分为若干个区域,这些区域中包含了逻辑上的年轻代和老年代
        • 兼顾年轻代和老年代
      • 空间整合
        • CMS 标记清除算法、内存碎片、若干此GC后进行一次碎片整理
        • 内存回收时以region作为单位的。region之间是复制算法,但整体上可以看做是标记压缩算法
      • 可预测的停顿时间模型
        • 可以预测:使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒
    • 参数设置
      • -XX:+UseG1GC 手动指定使用G1收集器执行内存回收任务
      • -XX:G1HeapRegionSize 设置每个region的大小。值是2的幂,范围是1MB到32MB之间,目标是根据最小的java堆大小划分出约2048个区域。默认是堆内存的1/2000
      • -XX:MaxGCPauseMillis 设置期望达到的最大GC停顿时间指标(JVM会尽力实现,但不保证达到)。默认是2000ms
      • -XX:ParallelGCThread 设置STW工作线程数的值。最多设置为8
      • -XX:ConcGCThreads 设置并发标记的线程数。将n设置为并行垃圾回收线程数(ParallelGCThreads)的1/4左右
      • -XX:InitiatingHeapOccupancyPercent 设置触发并发GC周期的java堆占用率阈值。超过此值,就触发GC。默认是45
    • 区域
      • Eden
      • S
      • Old
      • H
      • 如果一个对象的容量超过了0.5的region就会放到h区,如果一个放不下,就找连续的空间存放 也是放在H区
    • 回收过程
      • 年轻代GC
      • 老年代并发标记过程
      • 混合回收

查看默认的垃圾回收器

  • -XX:+PrintCommandLineFlags: 查看命令行相关参数(包含使用的垃圾收集器)
  • 使用命令行指令:jinfo -flag 相关垃圾回收器参数 进程ID
  • jdk8 新生代采用的是Parallel Scavenge,老年代Parallel Old。
  • jdk9 使用的G1

相关文章:

jvm之垃圾回收器

分类 按线程 串行并行工作模式 并发式独占式碎片处理方式 压缩式非压缩式工作内存空间 年轻代老年代 评估GC的性能指标 吞吐量:运行用户代码的时间占总运行时间的比例暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间内存占用: java堆区…...

【c++】类和对象7—继承

文章目录关于继承继承与非继承的对比继承方式继承中的对象模型继承中的构造和析构顺序继承同名成员处理方式继承同名静态成员处理方式多继承语法菱形继承关于继承 我们发现,定义一些类时,下级别的成员处理拥有上一级的共性,还有自己的特性。 …...

vue实现预览、下载和打印后端返回的pdf文件流

需求:后端返回pdf文件流,前端能够预览、下载打印。 后端返回的文件流部分截图 需要实现的效果图 前面第1步只是为了展示后台返回数据流,完成功能的时候,不需要调用接口的,只需要利用调用接口的url。 实现步骤&am…...

【Android视频号④ 问题总结】

这节坑比较多~ 差点没把我给整死!!! 环境介绍 首先我调试都是root过的真机,但是生产环境都是没有Root的云机,属于自己改的Rom框架也不是XP或LSP 是技术人员利用Xposed源码改的框架 问题&解决 模块源码更改 这…...

推荐算法—widedeep原理知识总结代码实现

wide&deep原理知识总结代码实现1. Wide&Deep 模型的结构1.1 模型的记忆能力1.2 模型的泛化能力2. Wide&Deep 模型的应用场景3. Wide&Deep 模型的代码实现3.1 tensorflow实现3.2 pytorch实现今天,总结一个在业界有着巨大影响力的推荐模型&#xff0c…...

PHP面向对象03:命名空间

PHP面向对象03:命名空间一、命名空间基础二、子空间三、命名空间访问1. 非限定名称2. 限定名称3. 完全限定名称四、全局空间五、命名空间应用六、命名空间引入一、命名空间基础 namespace,是指人为的将内存进行分隔,让不同内存区域的同名结构…...

Elasticsearch:使用 pipelines 路由文档到想要的 Elasticsearch 索引中去

路由文件 当应用程序需要向 Elasticsearch 添加文档时,它们首先要知道目标索引是什么。在很多的应用案例中,特别是针对时序数据,我们想把每个月的数据写入到一个特定的索引中。一方面便于管理索引,另外一方面在将来搜索的时候可以…...

前端开发常用的18个JavaScript框架和库

JavaScript 可以说是最流行的编程语言之一,也是Web 开发人员必须学习的 3 种语言之一,JavaScript 几乎可以做任何事情,更可以在包括物联网在内的多个平台和设备上运行。在WebGL库和SVG/Canvas元素的支持下,JavaScript变得惊人的强…...

理解、总结重点知识

一、常见的数据结构 1、数组结构 数组结构: 存储区间连续、内存占用严重、空间复杂度大 优点:随机读取和修改效率高,原因是数组是连续的(随机访问性强,查找速度快)缺点:插入和删除数据效率低&a…...

记一次从文件备份泄露到主机上线

前言 记录下某个测试项目中,通过一个文件备份泄露到主机上线的过程。 文件备份泄露 对于测试的第一项当然是弱口令,bp跑了一通词典,无果。目录又爆破了一通,发现一个web.rar可通,赶紧下载看看,如下图所示…...

8年测开经验面试28K公司后,吐血整理出1000道高频面试题和答案

1、python的数据类型有哪些 答:Python基本数据类型一般分为:数字、字符串、列表、元组、字典、集合这六种基本数据类型。 浮点型、复数类型、布尔型(布尔型就是只有两个值的整型)、这几种数字类型。列表、元组、字符串都是序列。 2、列表和元组的区别 答…...

Linux 基础知识之权限管理

目录一、权限的认识二、用户切换三、文件权限1.三类文件访问者2.文件权限类型3.文件访问权限4.文件权限值表示一、权限的认识 权限是对用户所能进行的操作的限制,如果不对用户作出限制,那么碰到恶意用户,就会损害其他用户的利益。 Linux是多用…...

百度LAC分词

对应数据的链接放这里了 import pandas as pd from util.logger import Log import os from util.data_dir import root_dir from LAC import LAC os_file_name os.path.split(os.path.realpath(__file__))[-1]# 加载LAC模型 lac LAC(mode"lac") # 载入自定义词典 …...

软件测试面试题 —— 整理与解析(1)

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:🌎【Austin_zhai】🌏 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能&#xf…...

深入浅出C++ ——红黑树模拟实现STL中的set与map

文章目录一、红黑树二、用泛型红黑树模拟实现set三、用泛型红黑树模拟实现map一、红黑树 红黑树作为set和map的底层容器,既要实现插入key又要实现插入pair,所以做了稍许的改动,使其成为一颗泛型结构的红黑树,通过不同的实例化参数…...

自动化测试框架设计

大数据时代,多数的web或app产品都会使用第三方或自己开发相应的数据系统,进行用户行为数据或其它信息数据的收集,在这个过程中,埋点是比较重要的一环。 埋点收集的数据一般有以下作用: 驱动决策:ABtest、漏…...

【虚拟仿真】Unity3D中实现鼠标的单击、双击、拖动的不同状态判断

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 这篇文章分享一下虚拟仿真项目中经常碰到鼠标事件控制代码。 …...

【2023】Prometheus-相关知识点(面试点)

目录1.Prometheus1.1.什么是Prometheus1.2.Prometheus的工作流程1.3.Prometheus的组件有哪些1.4.Prometheus有什么特点1.5.Metric的几种类型?分别是什么?1.6.Prometheus的优点和缺点1.7.Prometheus怎么采集数据1.8.Prometheus怎么获取采集对象1.9.Promet…...

英语二-电子邮件邀请短文写作

1. 邮件模板 Dear 邀请人, Hope you have a great day. I am writing this email to invite you to attend 主题. Please kindly find the following information for your reference: Time: 时间 Address: 地点 We hope that nothing will prevent you from coming, as…...

如何快速一次性通过pmp考试?

我们就从三个方向进行了解 1.PMP考试难不难? 2.PMP如何备考? 3.考试过程中需要注意什么? 一,PMP考试难不难? 首先关注的问题是,PMP考试难吗?我想全球55%的通过率和学会这边93.9%的通过率&a…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析

1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器&#xff08;TI&#xff09;推出的一款 汽车级同步降压转换器&#xff08;DC-DC开关稳压器&#xff09;&#xff0c;属于高性能电源管理芯片。核心特性包括&#xff1a; 输入电压范围&#xff1a;2.95V–6V&#xff0c;输…...

CMS内容管理系统的设计与实现:多站点模式的实现

在一套内容管理系统中&#xff0c;其实有很多站点&#xff0c;比如企业门户网站&#xff0c;产品手册&#xff0c;知识帮助手册等&#xff0c;因此会需要多个站点&#xff0c;甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...