04_jvm性能调优_并行收集器介绍

并行收集器(此处也称为吞吐量收集器)是类似于串行收集器的分代收集器。串行和并行收集器之间的主要区别在于并行收集器具有多个线程,用于加速垃圾回收过程。

通过命令行选项-XX:+UseParallelGC 可启用并行收集器。默认情况下,使用此选项,较小和较大的垃圾回收都会并行运行,以进一步减少垃圾回收开销。

并行收集器的垃圾回收线程数量

在具有小于N个硬件线程的计算机上,其中N大于8,并行收集器使用N的固定比例作为垃圾收集器线程数。

对于较大的N值,该比例约为5/8。对于小于8的N值,使用的数量为N。在特定平台上,该比例下降到5/16。可以使用命令行选项(稍后将描述)来调整垃圾收集器线程的具体数量。在只有一个处理器的主机上,并行收集器可能性能不如串行收集器,因为并行执行需要额外开销(例如同步)。但是,在运行具有中等到大型堆大小应用程序时,在具有两个处理器的计算机上,并行收集器通常会比串行收集器获得稍微更好的性能,并且当有多余两个处理器可用时,通常表现明显优于串行收集器。

可以使用命令行选项-XX:ParallelGCThreads=<N>来控制垃圾收集器线程数。如果正在通过命令行选项调整堆大小,则使用并行收集器获得良好性能所需的堆大小与串行收集器相同。然而,启用并行收集器应该会使垃圾回收暂停时间更短。由于多个垃圾回收线程参与了一次较小的回收过程,在此过程中可能会出现一些碎片化,因为在回收过程中从年轻代晋升到老年代。每个参与较小回收过程中的垃圾回收线程都会为晋升保留一部分老年代空间,并且这些“晋升缓冲区”的可用空间划分可能导致碎片化效果。减少垃圾回收线程数量并增加老年代大小将减少这种碎片化效果。


并行收集器中的分代排列

并行收集器中的分代排列不同。

该排列显示在图6-1中:

 

图6-1 并行收集器中的分代排列


并行收集器的自适应调整

当通过使用-XX:+UseParallelGC来选择并行收集器时,它会启用一种自动调优方法,允许您指定行为而不是指定代大小和其他底层调优细节。


指定并行收集器行为的选项

您可以指定最大的垃圾回收暂停时间、吞吐量和占用内存大小(堆大小)。

  • 最大垃圾回收暂停时间:最大暂停时间目标由命令行选项-XX:MaxGCPauseMillis=<N>指定。这被解释为希望的暂停时间为<N>毫秒或更短;默认情况下,没有最大暂停时间目标。如果指定了暂停时间目标,则会调整堆大小和其他与垃圾回收相关的参数,以尝试使垃圾回收暂停时间短于指定值;但是,并不总是能达到期望的暂停时间目标。这些调整可能导致垃圾收集器降低应用程序的整体吞吐量。
  • 吞吐量:吞吐量目标是以执行垃圾回收所花费的时间与未执行垃圾回收所花费的时间(即应用程序运行时间)之比来衡量的。此目标由命令行选项-XX:GCTimeRatio=<N>指定,该选项设置了垃圾回收时间与应用程序运行时间之比为1 / (1 + <N>)。
    例如,-XX:GCTimeRatio=19将目标设置为1/20或5% 的总时间用于垃圾回收。默认值为99,导致将1% 的总时间用于垃圾回收。
  • 占用内存大小:最大堆内存占用由选项-Xmx<N>指定。此外,该收集器还具有隐含目标,即在满足其他目标的情况下尽量减小堆大小。


并行收集器目标的优先级

这些目标依次为最大暂停时间目标、吞吐量目标和最小占用内存目标,且按照此顺序进行处理:

首先满足最大暂停时间目标。只有在达到此目标后,才会考虑吞吐量目标。同样地,只有在前两个目标达成之后,才会考虑占用内存大小的目标。


并行收集器分代大小调整

收集器在每次收集结束时会更新诸如收集器保持的平均暂停时间之类的统计数据。

然后进行用于确定是否已实现目标的测试,并根据需要调整代的大小。唯一例外的情况是显式垃圾回收,例如对System.gc()方法的调用,在统计数据和代大小调整方面被忽略。

增加和减少代大小是通过固定百分比递增来完成的,这样代就可以朝着其期望的大小逐步增加或减少。增加和减少是以不同速率进行的。默认情况下,代以20% 的增量递增,以5% 的增量递减。增长百分比由命令行选项-XX:YoungGenerationSizeIncrement=<Y>(年轻代)和-XX:TenuredGenerationSizeIncrement=<T>(老年代)控制。指定代缩小百分比由命令行标志-XX:AdaptiveSizeDecrementScaleFactor=<D>进行调整。如果增长幅度为X%,那么缩小量为X/D%。

如果收集器决定在启动时扩大某一代,则会额外添加一个百分比作为补充项。该补充项目随着收集次数而逐渐减少,并且没有长期影响。该补充项目旨在提高启动性能。对于缩小百分比没有额外添加。

如果不能达到最大暂停时间目标,则一次只会缩小一个代的大小。如果两个代的暂停时间都超过目标值,则首先会缩小暂停时间较长的那个代的大小。

如果无法实现吞吐量目标,则两个代的大小都会增加。每个都按其对总垃圾回收时间所占比例来增加。例如,如果年轻代的垃圾回收时间占总回收时间的25%,而将年轻代完全扩大20%,则年轻代将会增加5%。


并行收集器默认堆大小

除非在命令行上指定了初始堆大小和最大堆大小,否则它们将根据计算机上的内存量来计算。默认的最大堆大小为物理内存的四分之一,而初始堆大小为物理内存的64分之1。分配给年轻代的最大空间量为总堆大小的三分之一。


指定并行收集器初始和最大堆大小

您可以使用选项-Xms(最小堆大小)和 -Xmx(最大堆大小)来指定最小和最大堆大小。

如果您知道应用程序需要多少堆才能正常工作,那么可以将 -Xms 和 -Xmx 设置为相同的值。如果不确定,JVM 会从初始堆大小开始,并在堆使用和性能之间找到平衡时逐渐增加 Java 堆的大小。

其他参数和选项可能会影响这些默认值。要验证默认值,请使用-XX:+PrintFlagsFinal 选项,并查找输出中的-XX:MaxHeapSize。例如,在 Linux 上,您可以运行以下命令:

java -XX:+PrintFlagsFinal <GC options> -version | grep MaxHeapSize


过多的并行收集时间和OutOfMemoryError错误

并行收集器会在垃圾回收(GC)中花费过多时间时抛出 OutOfMemoryError。

如果总时间中有超过 98% 的时间用于垃圾回收,并且回收的堆空间不足 2%,则会抛出 OutOfMemoryError。该功能旨在防止应用程序因堆太小而无法取得实质进展而长时间运行。如有必要,可以通过在命令行中添加选项 -XX:-UseGCOverheadLimit 来禁用此特性。


并行收集器的测量指标

并行收集器的详细垃圾收集器的输出基本上与串行收集器的输出相同。

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

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

相关文章

LeetCode 105.从前序与中序遍历构造二叉树

题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,null,nul…

【LeetCode刷题记录】110. 平衡二叉树

110 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,3,3,null,null,4,4] 输出&#xff1a;false 示例 3&…

vue3项目引入VueQuill富文本编辑器(成功)及 quill-image-uploader 图像模块(未成功)

tip&#xff1a;重点解释都写在代码注释里了&#xff0c;方便理解&#xff0c;所以看起来比较密集 富文本基本使用 项目文件夹路径安装依赖 npm install vueup/vue-quilllatest --save 全局注册&#xff1a;main.js // main.js// 自己项目的一些配置&#xff08;只放了主要…

注册表获取autoCAD安装位置

注意事项 注意&#xff1a;①64位操作系统注册表会重定向&#xff0c;RegOpenKeyEx第4个参数得加上KEY_WOW64_64KEY&#xff1b;②RegOpenKeyEx遍历子项时注意第2和第4参数&#xff0c;参考图&#xff1a; ③RegQueryValueEx同样得注意第6参数 完整代码 std::unordered_map…

基于ssm+vue+Mysql的药源购物网站

开发语言&#xff1a;Java框架&#xff1a;ssmJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.…

Cokejogo巴西 电子游戏源码 游戏网站源码 电子游戏合集 电子游戏软件下载 游戏源码(带安装教程)

Cokejogo巴西pg电子游戏源码/H5PC端 前端vue编译后后端PHP/修复图片资源失效 后端测试环境&#xff1a;Linux系统CentOS7.6、宝塔、PHP7.2、MySQL5.6&#xff0c;根目录public&#xff0c;伪静态thinkPHP&#xff0c;开启ssl证书 源码下载&#xff1a;https://download.csdn.n…

CUDA内存模型

核函数性能并不只与线程束的执行有关。 CUDA内存模型概述 GPU和CPU内存模型的主要区别是&#xff0c;CUDA编程模型能将内存层次结构更好地呈现给用户&#xff0c;能让我们显示的控制它的行为。 对程序员来说&#xff0c;一般有两种类型的存储器&#xff1a; 可编程的&#x…

YOLO系列改进,自研模块助力涨点

目录 一、原理 二、代码 三、添加到YOLOv5中 一、原理 论文地址:

企业职能部门定岗定编项目如何做?

某国家级高新技术开发区成立于上世纪90年代&#xff0c;位于南方某市&#xff0c;地处三省交界处&#xff0c;是直接由该省委省政府创办的全省首批高新技术开发区。该开发区面积达到300平方公里&#xff0c;辖区人口30万人。历经数十年发展&#xff0c;在省委省政府的高度重视下…

QT:核心控件-QWidget

文章目录 控件enableobjectNamegeometrysetWindowTitleopacitycursorFonttooltipstyleSheet 控件 什么是控件&#xff1f; 如上所示&#xff0c;就是控件&#xff0c;而本篇要做的就是对于这些控件挑选一些比较有用的常用的进行讲解分析 在QT的右侧&#xff0c;会有对应的空间…

unity制作app(1)--登录 注册 界面

把学到的知识投入到生产中反而是一件简单的事情&#xff01; 1.调整canvas的形状&#xff0c;这里和camera没有任何关系! overlay&#xff01; 2.既然自适应&#xff0c;空间按钮的位置比例就很重要了&#xff01; game窗口中新增720*1280的分辨率&#xff01; 3.再回到can…

【论文阅读】ViTAE:Vision transformer advanced by exploring intrinsic inductive bias

ViTAE:Vision transformer advanced by exploring intrinsic inductive bias 论文地址摘要&#xff1a;简介&#xff1a;3 方法论3.1 重温视觉变压器3.2 ViTAE3.3 缩减单元3.4 Normal cell3.5 模型细节 4 训练4.1 Implementation details4.2 Comparison with the state-of-the-…

Elasticsearch:理解近似最近邻 (ANN) 算法

作者&#xff1a;来自 Elastic Elastic Platform Team 如果你是在互联网出现之前长大的&#xff0c;你会记得找到新喜好并不总是那么容易。我们是在无意中听到收音机里的新乐队时发现他们的&#xff0c;是因为忘了换频道偶然看到一个新电视节目的&#xff0c;也是几乎完全依据游…

ClickHouse安装(成功安装)

1.下载安装包 下面通过阿里镜像&#xff08;https://mirrors.aliyun.com/clickhouse/rpm/lts/&#xff09;进行下载&#xff0c;下载哪里&#xff0c;自行指定。 # deb包下载使用如下4行 wget https://mirrors.aliyun.com/clickhouse/deb/pool/stable/clickhouse-client_22.8…

git 的迁移

现象是gitlab经常会挂掉&#xff0c;linux会显示磁盘空间不足&#xff0c;实际上&#xff0c;我们linux某个目录的空间是4T。这个空间应该是足够的。猜测是gitlab的安装目录不对导致的空间不足。 1、查找原因 用rpm 安装gitlab会有自己的目录&#xff0c;很多安装文件会在opt…

MySql 导出导入(备份还原)

1&#xff0c;导出备份 要导出MySQL数据库中的数据&#xff0c;使用mysqldump命令。假设要导出名为mydatabase的数据库到名为backup.sql的文件中&#xff1a; mysqldump -u 用户名 -p 数据库名 > backup.sql 参数说明&#xff1a; -u mysql用户名称 -p 执行后会要求输入…

【C++】学习笔记——string_4

文章目录 六、string类7. string类的模拟实现 未完待续 六、string类 7. string类的模拟实现 我们在上文简单实现了string类的构造函数。不知道大家有没有发现一个问题&#xff0c;我们在进行实现无参的构造函数时&#xff0c;初始化列表将 _str 初始化为 nullptr 了&#xf…

Unity LensFlare 入门

概述 在项目的制作过程中&#xff0c;太阳光的使用一定是不可缺少的部分&#xff0c;但是如果想实现真实太阳光眼睛看到的镜头炫光效果&#xff0c;那这部分的内容一定不要错过喔&#xff0c;接下来让我们来学习这部分的内容吧&#xff01; Hale(光环效果) Color&#xff1a;…

操作系统:线程

目录 前言&#xff1a; 1.线程 1.1.初识线程 1.2.“轻量化”进程 1.3.线程与进程 2.线程控制 2.1.pthread原生线程库 2.2.线程控制的接口 2.2.1.线程创建 2.2.线程退出|线程等待|线程分离|线程取消 2.3.pthread库的原理 2.4.语言和pthread库的关系 2.5.线程局部…

数据可视化宝典:Matplotlib图形实战

在数据分析领域&#xff0c;图形化展示数据是非常重要的环节。Python中的matplotlib库是绘制各类图形的强大工具。本文将介绍如何使用matplotlib绘制折线图、直方图、饼图、散点图和柱状图等数据分析中常见的图形&#xff0c;并附上相应的代码示例&#xff0c;可以当初matplotl…