小研究 - JVM 垃圾回收方式性能研究(二)
本文从几种JVM垃圾回收方式及原理出发,研究了在 SPEC jbb2015基准测试中不同垃圾回收方式对于JVM 性能的影响,并通过最终测试数据对比,给出了不同应用场景下如何选择垃圾回收策略的方法。
目录
3 几种垃圾回收器
3.1 串行回收器
3.2 并行回收器
3.3 CMS回收器
3.4 G1回收器
3.5 Z回收器
4 垃圾回收器性能比较
3 几种垃圾回收器
垃圾收集算法可以看作 Java 虚拟机内存回收的抽象策略,而垃圾收集器则是其内存回收的具体实现。Java 虚拟机中,垃圾回收器不只一种,在不同的应用场景下如何选择性能最佳的垃圾回收器 是需要有清楚认识的,下面介绍几种常见的垃圾回收器。
3.1 串行回收器
串行回收器是一种单线程垃圾回收器,在进行每次垃圾回收时,只有一个线程工作,Java 应用程序中的其他所有线程暂停,等待垃圾回收完成(“Stop-The-World”过程)。在实时性要求高的应用 场景下,往往会造成用户体验不佳。串行回收器在新生代中使用复制算法,老年代中使用标记压缩法。
3.2 并行回收器
并行回收器在串行回收器的基础上做了改进,它使用多个线程同时进行垃圾回收,可以有效减少垃圾回收所需的时间。新生代中使用复制算法,老年代使用标记压缩算法。并行回收器关注系统的吞吐量,可以通过 -XX:MaxGCPauseMills 和 -XX:GCTimeRatio 控制的垃圾回收最大停顿时间和吞吐量。但须指出的是,减少一次收集的最大停顿时间,就会同时减少系统吞吐量,增大系统吞吐量又可能会同时增加一次垃圾回收的最大停顿时间。
3.3 CMS回收器
CMS回收器使用标记清除算法,利用多线程并行回收,侧重于系统停顿时间。CMS工作时首先经过初始标记与并发标记来标记出需要回收的对象、通过预清理做清理前的准备及控制停顿时间、再经过重新标记修正并发标记的数据、最后进行并发清除,以及并发重置为下次回收做准备 。
3.4 G1回收器
G1 回收器可以视为 CMS 回收器的替代品,它使用了独特的分区算法,相比于之前介绍的垃圾回收器将堆内存划分为固定内存大小的年轻代、老代和永久代(JDK1.8 后被元空间取代),G1 回收器将堆分割成一组大小相等的区域,每个区域是一个连续的虚拟内存范围,某些区域被功能与年轻代老年代相同,但是它们没有固定的大小,这为内存使用提供了更大的灵活性。在进行垃圾回收时, G1 回收器可以只选择部分区域,且部分垃圾回收工作能与 Java 应 用程序并行,提高回收效率的同时相应降低停顿时间。G1 回收器虽然也使用标记清除法,但与 CMS 不同的是 G1 可以有效复制移动对象,消除了潜在的内存碎片问题。此外,G1 还允许用户自行设定所需的暂停时间。
3.5 Z回收器
ZGC 是从 JDK11 中引入的一种新的支持弹性伸缩的低延迟垃圾收集器,主要实现了三大目标:停顿时间不超过 10ms、停顿时间不随堆或实时设置的大小而增加、支持从 8MB 到 16TB 的堆内存。ZGC的一个核心设计原则是使用读屏障(load barrier)和着色指针 (colored pointer)。在 Java 中加载对象的行为会受到读屏障的影响,而着色指针具有供读屏障使用的信息,它使 ZGC 能够查找、标记、定位和重新映射对象,这有助于降低垃圾回收的开销并极大降低停顿时间,且对吞吐量影响最大不超过 15%。作为一个并发的垃圾收集器,ZGC 所有的工作都是在 Java 应用程序线程执行时完成的,这极大地减少了垃圾回收对应用程序响应时间的影响。而且 Z 回收器现在还处于持续开发阶段,后续的开发目标是达到垃圾回收停顿时间不超过 1ms。
4 垃圾回收器性能比较
SPEC jbb2015 测试模拟了一个典型的商业应用的三层架构环境 中的中间层工作,包含商业逻辑、对象操作等,目的是衡量服务器 Java 应用之性能。模型建立在一个全球型连锁超市的 IT 基础架构 之上,通过线上线下购物、库存管理、供应链管理、用户购买行为的数据挖掘等业务来评估整个系统的吞吐量及响应时间随着整个系统业务量不断增加时的性能表现。SPECjbb2015 支持多种测试运行配置、支持虚拟化以及云环境,使用户能够全面分析和解决可能 存在于包括硬件、操作系统、JVM 和应用程序层的性能瓶颈问题。
SPEC jbb2015 测试结果包含主要包含两个测试指标 Max-jOPS 和 Critical-jOPS。最大性能指标 Max-jOPS 是系统最大每秒钟处理的 Java 操作数,可以看做在业务响应不失败的情况下,服务器 的极限吞吐量,反映的是系统极限 Java 应用性能。关键性能指标 Critical-jOPS 是系统在 5 个关键 SLA(服务水平协议)10ms, 25ms,50ms,75ms 和 100ms 响应时间下平均每秒 Java 操作数。选择这些点是为了保证不同行业使用的响应时间目标的合理分布,可以看做衡量的是在响应时间有限的情况下的系统吞吐量。
相关文章:
小研究 - JVM 垃圾回收方式性能研究(二)
本文从几种JVM垃圾回收方式及原理出发,研究了在 SPEC jbb2015基准测试中不同垃圾回收方式对于JVM 性能的影响,并通过最终测试数据对比,给出了不同应用场景下如何选择垃圾回收策略的方法。 目录 3 几种垃圾回收器 3.1 串行回收器 3.2 并行回…...
【网络安全带你练爬虫-100练】第15练:模拟用户登录
目录 一、目标1:理清逻辑 二、目标2:将每一步用代码进行表示 三、网络安全O 一、目标1:理清逻辑 模拟登录的基本流程 1、进入入口程序 2、读取目标URL 3、请求加上线程 4、确定请求数据包 5、请求格式的确认 6、数据的处理与判断 二、目标…...
Ansible
Ansible 文章目录 Ansible一、概念1.简介2.特性 二、ansible模块1.命令行格式2.模块1.command 模块2.shell 模块3.cron 模块4.user 模块5.group 模块6.copy 模块7.file 模块8.hostname 模块9.ping 模块10.yum 模块11.service/systemd 模块12.script 模块13.mount 模块14.archiv…...
kafka:消费者从指定时间的偏移开始消费(二)
我的前一篇博客《kafka:AdminClient获取指定主题的所有消费者的消费偏移(一)》为了忽略忽略掉上线之前的所有消息,从获取指定主题的所有消费者的消费偏移并计算出最大偏移来解决此问题。 但这个方案需要使用不常用的AdminClient类,而且如果该主题如果是第…...
Spring的加载配置文件、容器和获取bean的方式
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaweb 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 Spring配置文件和容器相关 一、加载properties文件1.1加载…...
(二)利用Streamlit创建第一个app——单页面、多页面
1 单页面app Step1:创建一个新的Python脚本。我们称之为uber_pickups.py。 Step2:在您喜爱的IDE或文本编辑器中打开uber_pickups.py,然后添加以下行: import streamlit as st import pandas as pd import numpy as npStep3&…...
一条sql查询语句在mysql中的执行过程是什么
mysql的连接器 我们想要在mysql中执行一条sql查询语句,首先需要连接到mysql服务,那么客户端首先要向mysql服务端发起连接请求,我们可以在客户端用mysql -h [ip] -P [port] -u 用户名 -p 密码 命令向服务端发起连接请求,这个连接请…...
网络互联究竟是需要什么协议相同,什么协议不同?
混淆概念的几个说法: 说法1: “以太网交换机不可以实现采用不同网络层协议的互联” 原因:以太网交换机是数据链路层的设备,不懂网络层的知识 说法2: “网桥可互联不同的物理层、不同的MAC子层以及不同速率的以太网”…...
ajax axios json
目录 一、ajax概述 1. 概念 2. 实现方式 (1)原生的JS实现方式(了解) (2) JQeury实现方式 二、axios 介绍 三、axios使用 1. axios 发送get/post请求 2. axios验证用户名称是否存在 四、json 1. …...
外观模式——提供统一入口
1、简介 1.1、概述 在软件开发中,有时候为了完成一项较为复杂的功能,一个类需要和多个其他业务类交互,而这些需要交互的业务类经常会作为一个完整的整体出现,由于涉及的类比较多,导致使用时代码较为复杂。此时&#…...
Vue中导入并读取Excel数据
在工作中遇到需要前端上传excel文件获取到相应数据处理之后传给后端并且展示上传文件的数据. 一、引入依赖 npm install -S file-saver xlsxnpm install -D script-loadernpm install xlsx二、在main.js中引入 import XLSX from xlsx三、创建vue文件 <div><el-uplo…...
CUDA常用函数
cudaDeviceSynchronize cudaDeviceSynchronize是一个CUDA函数,用于同步当前设备上的所有CUDA流。它会阻塞调用它的线程,直到所有设备上的CUDA流都执行完为止。这可以确保在进行后续的CUDA操作时,先前的操作已经完成。 在CUDA程序中࿰…...
72. ElasticSearch常用命令
索引管理 1新建索引 curl -XPUT http://10.42.172.35:9200/index012 读写权限 curl -XPUT -d {"blocks.read":false} http://10.42.172.35:9200/index01/_settings3 查看索引 单个 curl -XGET http://10.42.172.35:9200/index01/_settings多个 curl -XGET http…...
2023.7.26(同余方程的通解与特解)
Water(扩欧求特解与通解) 题意:给容量分别为A与B的水杯,问确切喝到C水的最小操作次数 有4种操作:选一杯全喝,选一杯全部倒掉,选一杯装满,将一杯的水尽量倒到另一杯中 思路:只有AxByC有解时才能确…...
Diffusion扩散模型学习3——Stable Diffusion结构解析-以图像生成图像(图生图,img2img)为例
Diffusion扩散模型学习3——Stable Diffusion结构解析-以图像生成图像(图生图,img2img)为例 学习前言源码下载地址网络构建一、什么是Stable Diffusion(SD)二、Stable Diffusion的组成三、img2img生成流程1、输入图片编…...
LangChain||什么是LangChain? LangChain有什么用?
从Auto-GPT说起: Auto-GPT可以调用本地电脑工具处理复杂信息;Auto-GPT可以围绕目标查阅资 料、“独立思考”、及时反馈、并 及时调整下一步操作…Auto-GPT的诞生,创造了大家 对“将LLM作为智慧大脑来高效 处理综合复杂任务”的想象;首次尝试串联大语言模…...
秋招算法备战第28天 | 93.复原IP地址、78.子集、90.子集II
93. 复原 IP 地址 - 力扣(LeetCode) 这个问题可以通过深度优先搜索(DFS)的方法来解决。我们要做的就是在字符串的每个可能位置插入点,然后检查生成的每一部分是否在 0-255 的范围内,以及是否没有前导零(除非这一部分本…...
Mongodb空间索引的使用以及与Django的对接
Mongodb的空间索引 Mongodb数据库大家都非常熟悉,是一个基于分布式文件存储的开源数据库系统,在高负载的情况下,添加更多的节点,可以保证服务器性能,数据结构由键值(key>value)对组成。MongoDB 文档类似于 JSON 对…...
Windows安装MySQL数据库
MySQL数据库安装 MySQL下载 下载地址:https://dev.mysql.com/downloads/mysql/ 可以选择下载msi或zip,以下为zip模式安装步骤 下载了mysql的zip安装包之后解压即可; Windows安装步骤 初始化MySQL,并记录生成的用户密码root的随机…...
聊聊函数式编程中的“式”
当谈到函数式编程的“式”时,通常指的是函数的组合、转换和应用,以及处理数据的方式和风格。在函数式编程中,式是用来构建程序逻辑的基本单元。 下面更详细解释函数式编程中的几个关键式: 函数的组合: 函数式编程中…...
百度文库纯净阅读助手:三分钟实现广告屏蔽与PDF导出
百度文库纯净阅读助手:三分钟实现广告屏蔽与PDF导出 【免费下载链接】baidu-wenku fetch the document for free 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wenku 您是否曾在百度文库上查阅资料时,被满屏的广告、VIP提示和干扰元素所困…...
AI Agent Runtime 重构:会话即事件日志的工程实践
1. 这不是新赛道,是 runtime 层的“操作系统时刻”来了 你有没有试过让一个 AI 代理连续工作四十分钟?不是闲聊,而是真正在查资料、调 API、写代码、汇总报告——一个接一个步骤往下走。我去年就搭过这么一套系统,用的是当时最火的…...
AArch64架构SMCR_EL3寄存器详解与SME向量计算优化
1. AArch64系统寄存器与SMCR_EL3概述在Armv8-A/v9架构中,系统寄存器是处理器状态和功能控制的核心枢纽。作为特权级软件与硬件交互的接口,每个系统寄存器都承担着特定的控制、配置或状态监控职责。SMCR_EL3(SME Control Register at EL3&…...
借助AI写教材,低查重实现,轻松打造符合需求的教材!
教材编写的挑战与AI工具解决方案 在教材编写的过程中,如何平衡原创性与合规性是一个重要的挑战。借鉴优秀教材的知识内容时,常常会担心重复率过高;而自己独立表述知识点,又得顾虑逻辑不严密、内容不准确等问题。引用他人研究成果…...
VisualTFT自定义圆形进度条:Canvas绘图与嵌入式GUI开发实践
1. 项目概述与核心价值最近在做一个工业HMI的项目,客户要求在设备启动自检的界面上,用一个圆环形的进度条来展示自检进度,而不是传统的长条状进度条。他们觉得圆环看起来更“高级”,也更符合他们产品的整体UI风格。接到这个需求&a…...
嵌入式Qt GUI与ESP32串口通信控制RGB灯实战指南
1. 项目概述与核心价值最近在做一个智能家居控制面板的原型,核心需求是通过一个图形界面来控制RGB氛围灯的颜色和亮度。硬件部分用的是常见的ESP32开发板,搭配一个可寻址的WS2812灯带。软件层面,我选择了在嵌入式Linux平台上用Qt来构建这个控…...
AI Agent 上线后,别只看成功率:你需要一套可观测性指标
很多团队做 AI Agent,上线前会问一个问题: “成功率多少?” 这当然要看。 但只看成功率,很容易误判。 因为 AI Agent 的问题不是简单的成功或失败。 它可能成功调用了工具,但参数是错的。 它可能生成了回复,…...
解决VMware安装macOS后分辨率锁死的烦恼:手把手教你安装VMware Tools并自定义显示设置
突破VMware中macOS显示限制:从工具安装到完美适配的全流程指南 当你在VMware中成功安装macOS系统后,可能会立刻遇到一个令人沮丧的问题——屏幕分辨率被锁定在低分辨率状态,窗口无法自由缩放,操作体验大打折扣。这种显示限制不仅…...
如何用Python自动化脚本高效抢购热门演出门票?智能抢票解决方案揭秘
如何用Python自动化脚本高效抢购热门演出门票?智能抢票解决方案揭秘 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 还在为热门演唱会门票秒光而烦恼吗࿱…...
CANN/pypto Tensor索引功能
pypto.Tensor索引功能说明 【免费下载链接】pypto PyPTO(发音: pai p-t-o):Parallel Tensor/Tile Operation编程范式。 项目地址: https://gitcode.com/cann/pypto Tensor索引是Tensor的核心操作之一,用于从Tensor中筛选、…...
