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 174.地下城游戏

思路&#xff1a;dp。 原先的时候其实是想这样用dfs的做法进行解答的&#xff0c;但是呢&#xff0c;是不对的。 这里作者dfs的思路是&#xff1a;首先找出来最小路径和&#xff0c;然后再处理最小路径和这条路径里面的初始值。但是&#xff0c;后来发现这样不一定是最优解&a…

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…

Dockerfile 里 ENTRYPOINT 和 CMD 的区别

ENTRYPOINT 和 CMD 的区别&#xff1a; 在 Dockerfile 中同时设计 CMD 和 ENTRYPOINT 是为了提供更灵活的容器启动方式。ENTRYPOINT 定义了容器启动时要执行的命令&#xff0c;而 CMD 则提供了默认参数。通过结合使用这两个指令&#xff0c;可以在启动容器时灵活地指定额外的参…

【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;只放了主要…

EditText与NestScrollView嵌套使用时,滑动冲突处理

期望 在Android开发中经常会有在一个大页面中&#xff0c;包含一个EditText的情况&#xff0c;一般情况下&#xff0c;大页面会通过NestScrollView或者ScrollView当作根View。 于是在布局文件中&#xff0c;我们常常这么写&#xff1a; <?xml version"1.0" en…

HTTP方式在线访问Hadoop HDFS上的文件解决方案

背景&#xff1a; 在做大数据和大模型产品的时候&#xff0c;方式设计的是将文件放在hdfs上进行管理&#xff0c;前几天遇到一个需求&#xff1a;需要通过http的方式去访问hdfs上的问题&#xff0c;以前基本上都是通过hdfs://hadoop01:9000,去访问文件&#xff0c;于是经过一番…

注册表获取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.…

【Redis基础】Redis知识体系详解-Redis概念和基础

1. 什么是Redis Redis是一款用C语言编写的key-value存储系统&#xff08;键值存储系统&#xff09;&#xff0c;支持丰富的数据类型&#xff0c;如&#xff1a;String、list、set、zset、hash。 Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存&#xff0c;事…

SpringBoot / SpringCloud 注册与发现

SpringBoot / SpringCloud EnableDiscoveryClient与EnableEurekaClient区别 在使用Spring Cloud feign使用中在使用服务发现的时候提到了两种注解&#xff0c;一种为EnableDiscoveryClient,一种为EnableEurekaClient,用法上基本一致。 spring cloud中discovery service有许多…

C#(C Sharp)学习笔记_方法(Medthod)【十六】

什么是方法&#xff1f; 在编程中&#xff0c;方法&#xff08;Method&#xff09;是一个执行特定操作的代码块。它是一种将逻辑封装起来的方式&#xff0c;使得代码更加模块化、重用性更高&#xff0c;并且易于维护。以下是方法的一些关键特性&#xff1a; 封装性&#xff1a…

【WEEK10】学习目标及总结【Spring Boot】【中文版】

学习目标&#xff1a; 学习SpringBoot 学习内容&#xff1a; 参考视频教程【狂神说Java】SpringBoot最新教程IDEA版通俗易懂MVC自动配置原理员工管理系统 准备工作首页实现 学习时间及产出&#xff1a; 第十周MON~TUE 2024.4.29【WEEK10】 【DAY1】MVC自动配置原理【中文版…

使用Spring Boot、Redis和Spring Cache实现高效缓存

在当今互联网应用开发中&#xff0c;性能是至关重要的因素之一。随着用户量的增加和数据量的膨胀&#xff0c;有效地管理数据的访问和处理变得愈发重要。 在这个背景下&#xff0c;缓存成为了提升应用性能的常用手段之一。本文将介绍如何利用Spring Boot、Redis以及Spring Cac…

Unity编辑器扩展

Unity编辑器扩展 引言 在游戏开发领域&#xff0c;Unity因其强大的功能和灵活性而备受欢迎。Unity的编辑器扩展能力尤其突出&#xff0c;它允许开发者自定义编辑器界面和功能来满足特定的开发需求。通过编辑器扩展&#xff0c;我们可以优化工作流程&#xff0c;提高生产力&am…

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…

JSP和tomcat

JSP&#xff08;JavaServer Pages&#xff09;是一种用于开发动态Web内容的技术&#xff0c;它允许开发者将Java代码嵌入到HTML页面中。JSP页面在服务器端被解析并转换成Servlet&#xff0c;然后由Servlet容器&#xff08;比如Tomcat&#xff09;执行。JSP允许开发者在页面中使…

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

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

截取视频第一帧当做封面

看了好多处理视频的框架 比如ffmpeg&#xff0c;很多都需要依赖安装第三方插件&#xff0c;比较麻烦&#xff0c;找到一个内嵌进去不需要额外安装的&#xff1a;jcodec 一 首先代码中添加依赖 <!--视频生成预览图用--><dependency><groupId>org.jcodec</…