小研究 - 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的随机…...
聊聊函数式编程中的“式”
当谈到函数式编程的“式”时,通常指的是函数的组合、转换和应用,以及处理数据的方式和风格。在函数式编程中,式是用来构建程序逻辑的基本单元。 下面更详细解释函数式编程中的几个关键式: 函数的组合: 函数式编程中…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...
FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
