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

本文从几种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.mzph.cn/news/15103.shtml

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

相关文章

【数据结构】栈(Stack)的实现 -- 详解

一、栈的概念及结构 1、概念 栈:一种特殊的线性表,其只允许在表尾进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出 LIFO(Last In First Out)的原则。 压栈…

SpringBoot的pom文件、容器、组件

一、pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4…

求分享如何批量压缩视频的容量的方法

视频内存过大&#xff0c;不但特别占内存&#xff0c;而且还会使手机电脑出现卡顿的现象&#xff0c;除此之外&#xff0c;如果我们想发送这些视频文件可能还会因为内存太大无法发送。因此&#xff0c;我们可以批量地压缩视频文件的内存大小&#xff0c;今天小编要来分享一招&a…

聊聊原子弹之父:奥本海默

最近诺兰的电影奥本海默即将热映,其改编自Kai Bird和 Martin J. Sherwin的 2005 年Pulitzer Prize 获奖小说:“American Prometheus: The Triumph and Tragedy of J. Robert Oppenheimer”。这本小说作者研究奥本海默25年,才得以成形,可见奥神本人身上的故事曲折和传奇。 …

Arrays(数组)工具类

java.util.Arrays 是一个与数组相关的工具类&#xff0c;里面提供了大量静态方法&#xff0c;用来实现数组常见的操作。 Arrays.toString ( 数组名 )将参数数组变成字符串&#xff08;按照默认格式&#xff1a;[10, 20, 30]&#xff09;Array.sort ( 数组名 ) 按照默认升序&…

数据库索引优化与查询优化——醍醐灌顶

索引优化与查询优化 哪些维度可以进行数据库调优 索引失效、没有充分利用到索引-一索引建立关联查询太多JOIN (设计缺陷或不得已的需求) --SQL优化服务器调优及各个参数设置 (缓冲、线程数等)–调整my.cnf数据过多–分库分表 关于数据库调优的知识点非常分散。不同的 DBMS&a…

Pycharm工具Python开发自动添加注释(详细)

方法自动添加参数注释 定义了一个函数&#xff0c;在函数下面敲入了三个双引号后&#xff0c;enter回车并没有自动出现注释&#xff0c;如图&#xff1a; 解决办法 Pycharm中依次打开File —> Settings —> Tools —> Python Integrated Tools&#xff0c;如图&…

isp调试工具环境搭建及其介绍!

一、isp调试环境搭建&#xff1a; 后期调试isp&#xff0c;是在rv1126提供的RKISP2.x Tuner工具上进行调试&#xff0c;所以我们大前提必须要把这个环境和一些操作先搞熟悉来&#xff0c;后面有一些专用术语&#xff0c;我们遇到了再去看&#xff0c;现在专门看一些专用术语&am…

【TypeScript】类型声明及应用(二)

【TypeScript】类型声明及应用&#xff08;二&#xff09; 一、前言 TypeScript开发中需要对定义的变量指定类型&#xff0c;目前版本都支持哪些类型&#xff0c;每一个类型都有哪些含义&#xff0c;在这篇文章中&#xff0c;我们将会对其进行总结说明 二、JavaScript基本数据…

Scrapy和Selenium整合(一文搞定)

文章目录 前言一、开始准备1. 包管理和安装chrome驱动2. 爬虫项目的创建&#xff08;举个栗子&#xff09;3. setting.py的配置 二、代码演示1. 主爬虫程序2. 中间件的配置3. 定义item对象4. 定义管道 总结 前言 scrapy和selenium的整合使用 先定个小目标实现万物皆可爬&#…

Pycharm debug程序,跳转至指定循环条件/循环次数

在断点出右键&#xff0c;然后设置条件 示例 for i in range(1,100):a i 1b i 2print(a, b, i) 注意&#xff1a; 1、你应该debug断点在循环后的位置而不是循环上的位置&#xff0c;然后你就可以设置你的条件进入到指定的循环上了 2、设置条件&#xff0c;要使用等于符号…

C# Assembly 反射动态加载程序集(动态加载Dll)Demo

No1、本Demo 定义了一个接口IserviceToolFrame&#xff0c;接口中有一个方法Run。 No2、在另外两个工程中&#xff0c;分别定义两个类serviceToolCatComplete、serviceToolDogComplete实现接口IserviceToolFrame。 No3、控制台程序通过动态加载Dll的方式去调用IserviceToolFram…

Flutter 使用texture_rgba_renderer实现桌面端渲染视频

Flutter视频渲染系列 第一章 Android使用Texture渲染视频 第二章 Windows使用Texture渲染视频 第三章 Linux使用Texture渲染视频 第四章 全平台FFICustomPainter渲染视频 第五章 Windows使用Native窗口渲染视频 第六章 桌面端使用texture_rgba_renderer渲染视频&#xff08;本…

#P0999. [NOIP2008普及组] 排座椅

题目描述 上课的时候总会有一些同学和前后左右的人交头接耳&#xff0c;这是令小学班主任十分头疼的一件事情。不过&#xff0c;班主任小雪发现了一些有趣的现象&#xff0c;当同学们的座次确定下来之后&#xff0c;只有有限的 DD 对同学上课时会交头接耳。 同学们在教室中坐…

《GreenPlum系列-部署维护》GreenPlum数据库Standby故障处理

一、Standby故障 1.检查监控中心数据库状态 2.查看master节点数据库状态 su - gpadmin gpstate -f二、重启数据库 1.快速关闭数据库 [gpadminmdw pg_log]$ gpstop -M fast ... Continue with Greenplum instance shutdown Yy|Nn (defaultN): > y ...2.开启数据库 [gpad…

Redis以及Java使用Redis

一、Redis的安装 Redis是一个基于内存的 key-value 结构数据库。 基于内存存储&#xff0c;读写性能高 适合存储热点数据&#xff08;热点商品、资讯、新闻&#xff09; 企业应用广泛 官网&#xff1a;https://redis.io 中文网&#xff1a;https://www.redis.net.cn/ Redis…

【LeetCode】单链表——刷题

你曾经灼热的眼眶&#xff0c;是人生中少数的笨拙又可贵的时刻。 文章目录 1.反转单链表 题目思路及图解 代码中需要注意的问题 2.移除链表元素 题目思路及图解 代码中需要注意的问题 大家好&#xff0c;我是纪宁。 这篇文章分享给大家一些经典的单链表leetcode笔试题的…

类变量和类方法

类变量和类方法 引入 思考&#xff1a;有一群小孩在玩堆雪人&#xff0c;不时有新的小孩加入&#xff0c;请问如何知道现在有多少小孩在玩&#xff1f; 静态变量内存分析 1、静态变量被对象共享 2、静态变量可能在堆中&#xff0c;也可能在方法区的静态域中&#xff0c;这…

Flutter 的线程模型和异步原理

本文字数&#xff1a;&#xff1a;36130字 预计阅读时间&#xff1a;91分钟 在Android应用中&#xff0c; 用户时常会遇到界面卡顿的情况&#xff0c;非常影响用户的体验。作为Android开发肯定都知道&#xff1a;应用在主线程里做了大量的耗时操作(例如文件读写&#xff0c; 数…

stable diffusion打造自己专属的LORA模型

通过Lora小模型可以控制很多特定场景的内容生成。 但是那些模型是别人训练好的&#xff0c;你肯定很好奇&#xff0c;我也想训练一个自己的专属模型&#xff08;也叫炼丹&#xff5e;_&#xff5e;&#xff09;。 甚至可以训练一个专属家庭版的模型&#xff08;family model&…