小研究 - JVM 垃圾回收方式性能研究(一)

news2024/11/18 9:33:45

本文从几种JVM垃圾回收方式及原理出发,研究了在 SPEC jbb2015基准测试中不同垃圾回收方式对于JVM 性能的影响,并通过最终测试数据对比,给出了不同应用场景下如何选择垃圾回收策略的方法。

目录

1 引言

2 垃圾回收算法

2.1 标记清除法

2.2 复制算法

2.3 标记压缩法

2.4 分区算法


1 引言

垃圾回收(Garbage Collection, GC)是 Java 虚拟机(JVM)中 使用的一种内存管理方案,它能够不断自动释放内存中的不再被使用的对象,并按照特定的垃圾回收算法实现对于内存资源的管理。相较于 C/C++ 手动内存管理方式,GC 的出现大大减少了开发人 员在内存资源管理方面的工作,是 JVM 的核心组成部分,并且对 JVM 的性能有着重要的影响。随着技术及硬件的发展,新的垃圾回收方式也在随着 JDK 版 本的更新而被加入,如在 JDK1.7 中正式引入了 G1 回收器,JDK 11 中引入了 Z 回收器等。面对如此多的垃圾回收器,如何在不同实际应用场景下中选择最适合的是进行JVM性能优化的首要问题,解决这一问题则必须先了解不同垃圾回收方式的性能表现。以往也有相关方面的研究,但性能测试或基于 SPEC JVM2008又或是基 于 SPEC jbb2000[3-4] 等一些现已不再提供支持的测试工具,已不能适应当前时代的需求,而通过一种权威且最新的基准测试工具分析不同垃圾回收器的性能表现是十分有意义的。SPEC jbb(Java Business Benchmark)基准测试是标准性能评估组织 SPEC 发布的一项用于衡量服务器 Java 应用性能的测试基准。从 2000 年 6 月 SPEC 组织发布第一版服务器 Java 性能测试基准 SPEC jbb2000 至今,历经了 SPEC jbb2005(2006.1-2013.10)、 SPEC jbb2013(2013.1-2014.12)多个版本的更新后,SPEC jbb2015 (2015.9- 至今)基于最新的 Java 应用程序特性开发,支持虚拟化和云环境。现在 SPEC jbb 测试已经发展成为 JVM 厂商、Java 开发者,研究学者,以及相关学术机构评估 Java 业务应用性能及可扩展性的一项权威基准测试标准。 本文将首先从垃圾回收原理出发,分别介绍几种垃圾回收器, 然后对这几种垃圾回收器在基准测试中的性能表现进行分析。

2 垃圾回收算法

Java 自动化的管理内存资源必须通过垃圾回收算法来确定哪些是有效的对象,哪些是无效的对象,对于无效的对象就要进行垃圾回收处理。作为垃圾回收器的实现基础,下面先介绍常见的垃圾回收算法。

2.1 标记清除法

在垃圾回收算法中,根是指向对象的指针的起点部分。通过根对象进行引用搜索,最终可达的对象被称为可达对象;通过根对象进行引用搜索,最终没有被引用的对象被称为不可达对象。在标记阶段,首先通从根节点开始标记所有的可达对象,不可达对象则为垃圾对象。在清除阶段,清除所有未被标记的对象。由于清除时不考虑内存空间的连续性,因此标记清除法最大的问题是产生内存空 间碎片。特别是在进行大对象内存分配时,相较于连续内存空间,内存碎片的存在会降低堆内存效率。

2.2 复制算法

复制算法将内存空间划分为相等的两部分,且每次只会只使用其中的一部分,当垃圾回收时,首先将使用中那部分内存里存活的对象复制到另一部分内存区,接着清除使用的内存块中的所有对象, 最后将两个内存区进行互换,从而完成垃圾回收。复制算法在复制的过程中能够有效避免内存空间碎片的产生,但代价是系统内存空间损失一半。

2.3 标记压缩法

标记压缩法是一种针对老年代的垃圾回收算法。对于老年代,由于大部分对象都是存活对象,使用复制算法代价将使内存折半,成本太高并不适用。标记压缩法正是为了应对这种情况而产生,首 先从根节点开始,对所有可达对象进行标记,然后将所有存活的对象压缩到内存一端,再清理剩余的所有的空间。这种方法既避免了碎片的产生,又不需要将内存分为两半,效率很高。

2.4 分区算法

分区算法将整个堆空间划分成连续的不同小区间,每一小区间都独立使用,独立回收,并可以控制一次回收的小区间数量。一般来说,在相同条件下,堆空间越大,进行一次垃圾回收的所需的时 间就越长,导致产生的停顿时间也越长。因此如果将堆内存分割成多个小块,并根据目标停顿时间的要求,每次合理地控制回收部分小区间,而不是回收整个堆空间,则可以有效减小一次垃圾回收所产生的的停顿时间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/813898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iOS开发-实现获取下载主题配置动态切换主题

iOS开发-实现获取下载主题配置动态切换主题 iOS开发-实现获取下载主题配置更切换主题,主要是通过请求服务端配置的主题配置、下载主题、解压保存到本地。通知界面获取对应的图片及颜色等。 比如新年主题风格,常见的背景显示红色氛围图片、tabbar显示新…

Visual Studio 设置默认编码格式为 UTF-8

1.添加高级保存选项 2.更改编码格式

客户端服务器通过Socket API通信流程 通过源码角度分析 三握手四挥手都过程的状态改变 及 例如accept()connect()具体做了什么

首先我们先说下网络编程API: 数据在网络上通信,通信的双方一个是 客户端, 一个是 服务器 更具体来说,不是 客户端和服务器这两个机器在 经由互联网 进行通信, 而是 客户端上的某一进程 与 服务器端的某一进程 进…

Java 单链表

链表基本介绍 链表在内存中的实际存储结构 链表的逻辑结构 单链表应用实例 代码实现 // 英雄节点,存储了英雄的信息 class HeroNode {public int id; // 英雄编号public String name; // 英雄名字public String nickName; // 英雄昵称public HeroNode next; // 指…

【系统软件01】devtoolset离线安装gcc

【系统软件01】devtoolset离线安装gcc 一、SCL简介二、SCL源安装三、离线下载devtoolset1、Developer Toolset2、下载devtoolset-93、压缩devtoolset-9 三、离线安装devtoolset-9(gcc9.3)1、解压devtoolset-9.tar.gz2、安装devtoolset-9 四、设置环境变量(使用gcc9.3)1、当前窗…

LeetCode547.Number-Of-Provinces<省份问题>

题目: 思路: 连通的部分加起来,然后总的 减去连通的部分。 但是很可惜 只能通过部分 似乎将st[i][j] st[j][i] 改变之后是可行的 但是实际上 1 2 连通后 2 1 确实是不会再加。 但是 2 3却还是在加一遍。 好吧。答案的思路是使用并查集。将…

lc209.长度最小的子数组

暴力破解:二次for循环遍历num[i]...num[j],记录满足条件的最小长度 前缀和二分:前缀和降低计算num[i]...num[j]的时间复杂度 对前缀和数组中的每个数进行遍历,找到距离这个数满足条件的最小长度 前缀和数组单调递增,此…

蓝海卓越计费管理系统任意文件读取下载

……人哪,活着是这么的苦!一旦你从幸福的彼岸被抛到苦难的此岸,你真是处处走头无路;而现在你才知道,在天堂与地狱之间原来也只有一步之遥! 漏洞描述 蓝海卓越计费管理系统存在任意文件读取漏洞&#xff0…

pycharm写scrapy遇到的问题

目录 背景创建scrapy难受的开始指定类型修改模板并指定使用运行scrapy 背景 居然还有万能的pycharm解决不了的python程序??? 创建scrapy 由于PyCharm中没有直接创建Scrapy项目的选项,所以使用命令行创建一个项目 安装scrapy pip install…

11、springboot项目启动时对容器中的bean进行延迟初始化

springboot项目启动时对容器中的bean进行延迟初始化 预初始化: Spring Boot在启动应用时,会启动Spring容器,当启动Spring容器时,Spring会自动初始化容器中所有的singleton Bean——这是默认行为 预初始化的好处: 1、项…

Qt 4. 发布exe

把ex2.exe放在H盘Ex2文件夹下,执行 H:\Ex2>windeployqt ex2.exe H:\Ex2>windeployqt ex2.exe H:\Ex2\ex2.exe 64 bit, release executable Adding Qt5Svg for qsvgicon.dll Skipping plugin qtvirtualkeyboardplugin.dll due to disabled dependencies (Qt5…

C++多线程的简单使用

一.引言 在C学习中,我们在初步学习的过程中写的程序都只可以在本地并且只可以被本主机访问。在此,我们会想要让别人也体验一下我们邪恶的程序的话,我们该怎么办呢? 首先我们介绍的时多线程编程,就相当于我们的登录qq&…

flask数据库操作

本文将详细介绍在Flask Web应用中如何设计数据库模型,并使用Flask-SQLAlchemy等扩展进行数据库操作的最佳实践。内容涵盖数据模型设计,ORM使用,关系映射,查询方法,事务处理等方面。通过本文,您可以掌握Flask数据库应用的基本知识。 Flask作为一个流行的Python Web框架,提供了高…

强化学习(PPO,DQN,A3C)

目录 1.强化学习和深度学习的区别 2. 强化学习思路 3.baseline 4.PPO 4.1on-policy和off-policy简单理解 4.2actotcritic 5.DQN(回归问题) 4.1公式 4.2Q表 参考文献 1.强化学习和深度学习的区别 强化学习和深度学习的区别:在深度学习中&a…

【*1900 图论+枚举思想】CF1328 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 注意到题目的性质&#xff1a;满足条件的路径个数是极少的&#xff0c;因为每个点离路径的距离<1 先考虑一条链&#xff0c;那么直接就选最深那个点作为端点即可 为什么&#xff0c;因为我们需要遍历所有点…

助你丝滑过度到 Vue3 其组合式API的应用 ②⑦

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; VUE3~TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f449;…

C++成神之路 | 第一课【步入C++的世界】

目录 一、认识C++ 1.1、关于 C++ 1.2、C++的前世今生 1.2.1、C+

【Tomcat---1】IDEA控制台tomcat日志输出乱码解决

一、修改IDEA的文件编码配置为UTF-8 二、修改IDEA的vmoptions文件&#xff0c;添加-Dfile.encodingUTF-8 到Tomcat目录/conf文件夹修改logging.properties 重启idea即可。采用统一的编码

ansible的脚本——playbook剧本

目录 一、playbook的组成 二、 playbook安装httpd服务 1.编写playbook剧本 2.运行playbook 三、定义、引用变量 四、 指定远程主机sudo切换用户 五、when条件判断 六、迭代 七、Templates 模块 1.先准备一个以 .j2 为后缀的 template 模板文件&#xff0c;设置引用的变…