当前位置: 首页 > news >正文

Java性能权威指南-总结6

Java性能权威指南-总结6

  • 垃圾收集入门
    • 垃圾收集概述
      • GC算法
      • 选择GC算法

垃圾收集入门

垃圾收集概述

GC算法

JVM提供了以下四种不同的垃圾收集算法:

  1. Serial垃圾收集器

Serial垃圾收集器是四种垃圾收集器中最简单的一种。如果应用运行在Client型虚拟机(Windows平台上的32位JVM或者是运行在单处理器机器上的JVM)上,这也是默认的垃圾收集器。

Serial收集器使用单线程清理堆的内容。使用Serial收集器,无论是进行Minor GC还是Full GC,清理堆空间时,所有的应用线程都会被暂停。进行Full GC时,它还会对老年代空间的对象进行压缩整理。通过-XX:+UseSerialGC标志可以启用Serial收集器(大多数情况下,如果可以使用这个标志,默认就会开启)。注意,跟大多数的JVM标志不同,关闭Serial收集器不能简单地将加号符变成减号符(譬如,使用-XX:-UseSerialGC)。在Serial收集器作为默认收集器的系统上,如果需要关闭Serial收集器,可以通过指定另一种垃圾收集器来实现。

  1. Throughput垃圾收集器

Throughput收集器是Server级虚拟机(多CPU的Unix机器以及任何64位虚拟机)的默认收集器。
Throughput收集器使用多线程回收新生代空间,Minor GC的速度比使用Serial收集器快得多。处理老年代时Throughput收集器也能使用多线程方式。这已经是JDK 7u4及之后的版本的默认行为,对于之前老版本的JDK7虚拟机,通过-XX:+UseParalleloldGc标志可以开启这个功能。由于Throughput收集器使用多线程,Throughput收集器也常常被称为Parallel收集器。 Throughput收集器在Minor GC和Full GC时会暂停所有的应用线程,同时在Full GC过程中会对老年代空间进行压缩整理。由于在大多数适用的场景,它已经是默认的收集器,所以基本上不需要显式地启用它。如果需要,可以使用-XX:+UseParallelGC-XX:+UseParalleloldGc标志启用Throughput收集器。

  1. CMS收集器

CMS收集器设计的初衷是为了消除Throughput收集器和Serial收集器Full GC周期中的长时间停顿。CMS收集器在Minor GC时会暂停所有的应用线程,并以多线程的方式进行垃圾回收。然而,这其中最显著的不同是,CMS不再使用Throughput的收集算法(-XX:+UseParallelGC),改用新的算法来收集新生代对象(使用-XX:+UseParNewGC标志)。

CMS收集器在Full GC时不再暂停应用线程,而是使用若干个后台线程定期地对老年代空间进行扫描,及时回收其中不再使用的对象。 这种算法帮助CMS成为一个低延迟的收集器:应用线程只在Minor GC以及后台线程扫描老年代时发生极其短暂的停顿。应用程序线程停顿的总时长与使用Throughput收集器比起来短得多。

额外付出的代价是更高的CPU使用:必须有足够的CPU资源用于运行后台的垃圾收集线程,在应用程序线程运行的同时扫描堆的使用情况。除此之外,后台线程不再进行任何压缩整理的工作,这意味着堆会逐渐变得碎片化。如果CMS的后台线程无法获得完成他们任务所需的CPU资源,或者如果堆变得过度碎片化以至于无法找到连续空间分配对象,CMS就蜕化到Serial收集器的行为:暂停所有应用线程,使用单线程回收、整理老年代空间。 这之后又恢复到并发运行,再次启动后台线程(直到下一次堆变得过度碎片化)。通过-XX:+UseConcMarkSweepGC-XX:+UseParNewGC标志(默认情况下,这两个标志都是禁用的)可以启用CMS垃圾收集器。

  1. G1垃圾收集器

G1垃圾收集器(或者垃圾优先收集器)的设计初衷是为了尽量缩短处理超大堆(大于4GB)时产生的停顿。G1收集算法将堆划分为若干个区域(Region),不过它依旧属于分代收集器。这些区域中的一部分包含新生代,新生代的垃圾收集仍然采用暂停所有应用线程的方式,将存活对象移动到老年代或者Survivor空间。同其他的收集算法一样,这些操作也利用多线程的方式完成。
G1收集器属于Concurrent收集器:老年代的垃圾收集工作由后台线程完成,大多数的工作不需要暂停应用线程。由于老年代被划分到不同的区域,G1收集器通过将对象从一个区域复制到另一个区域,完成对象的清理工作,这也意味着在正常的处理过程中,G1收集器实现了堆的压缩整理(至少是部分的整理)。因此,使用G1收集器的堆不大容易发生碎片化——虽然这种问题无法避免。

同CMS收集器一样,避免Full GC的代价是消耗额外的CPU周期:负责垃圾收集的多个后台线程必须能在应用线程运行的同时获得足够的CPU运行周期。通过标志-XX:+UseG1GC(默认值是关闭的)可以启动G1垃圾收集器。

触发及禁用显式的垃圾收集
通常情况下垃圾收集是由JVM在需要的时候触发:新生代用尽时会触发Minor GC,老年代用尽时会触发Full GC,或者堆空间即将填满时会触发Concurrent垃圾收集(如果情况需要)。

Java也提供了一种机制让应用程序强制进行GC:这就是System.gc()方法。通常情况下,试图通过调用这个方法显式触发GC都不是个好主意。调用这个方法会触发FullGC(即使JVM使用CMS或者G1垃圾收集器),应用程序线程会因此而停顿相当长的一段时间。同时,调用这个方法也不会让应用程序更高效,它会让GC更早地开始,但那实际只是将性能的影响往后推迟而已。

任何原则都有例外,尤其是在做性能监控或者基准测试时。运行少量的代码进行基准测试时,为了更快地预热JVM,在测量周期之前强制进行一次GC还是有意义的。类似的情况还包括在进行堆分析时,通常在获取堆转储之前,强制进行一次Full GC是一个不错的主意。虽然大多数抓取堆转储的方法都能进行Full GC,也存在其他的方法可以强制进行Full GC:你可以通过执行jcmd<进程号>GC.run,或者使用jconsole连接到JVM在内存面板上单击“进行GC”按钮。

另一个例外是RMI,作为它分布式垃圾收集器的一部分,每隔一小时它会调用System.gc()一次。这里的调用时间可以通过系统属性中的-Dsun.rmi.dgc.server.gcInterval=N.Dsun.rmi.dgc.cli ent.gcInterval=N进行修改。N值的单位以毫秒记,在Java7(该值与之前的版本亦不相同)中的默认值为3600000(即一个小时)。

如果你运行的程序调用的第三方代码中错误地调用了System.gc()方法,可以通过JVM参数-XX:+DisableExplicitGC显式地禁止这种类型的GC;默认情况下该标志是关闭的。

快速小结

  1. 这四种垃圾收集算法分别采用了的不同的方法来缓解GC对应用程序的影响。
  2. 2.Serial收集器常用于仅有单CPU可用以及当其他程序会干扰GC的情况(通常是默认值)。
  3. 3.Throughput收集器在其他的虚拟机上是默认值,它能最大化应用程序的总吞吐量,但是有些操作可能遭遇较长的停顿。
  4. 4.CMS收集器能够在应用线程运行的同时并行地对老年代的垃圾进行收集。如果CPU的计算能力足以支撑后台垃圾收集线程的运行,该算法能避免应用程序发生Full
    GC。
  5. G1收集器也能在应用线程运行的同时并发地对老年代的垃圾进行收集,在某种程度上能够减少发生Full GC的风险。G1的设计理念使得它比CMS更不容易遭遇Full GC。

选择GC算法

GC算法的选择一方面取决于应用程序的特征,另一方面取决于应用的性能目标。
Serial收集器最适用于应用程序的内存使用少于100MB的场景。 这种情况下应用程序只需要很小的堆,无论是Throughput收集器的并行收集,还是CMS收集器或G1收集器的后台收集都发挥不了太大的作用。

这个Sizing准则也限制了Serial收集器的使用范畴。大多数的程序需要在Throughput和Concurrent收集器之间做出抉择;而选择的依据大多数情况下是由应用程序的性能目标所决定的m, 不同应用在耗时、吞吐量、或者平均(或者总量90%的)响应时间上的要求迥异。

  1. GC算法及批量任务

对批量任务而言,Throughput收集器所引入的停顿,尤其是FulI GC的停顿是主要的顾虑。每个任务的执行都会为总的执行时间增加一部分的延迟时间(elapse time)。如果每次Full GC耗时0.5秒,程序5分钟的运行时间内要进行20个这样的周期,那么性能的损耗就高达3.4%:如果没有这些停顿,程序可以在290秒而不是300秒内完成运行。

如果有额外的CPU处理能力(这很可能是个问题),那么使用Concurrent收集器将极大地提升应用程序的性能。 这里的关键在于我们能否提供足够的CPU给Concurrent收集器的线程进行后台的处理工作。举个简单的例子:一个单CPU的机器上,单线程的应用程序已经消耗了100%的CPU资源。该应用程序使用Throughput收集器运行时,GC间歇性地发生,导致应用程序线程出现停顿。同样的程序,如果切换到Concurrent收集器,操作系统一会在CPU上运行应用程序线程,一会儿运行GC的后台线程。最终的结果是一样的:操作系统运行其他线程时,应用程序线程依然会发生停顿(不过有可能是更短时间的停顿)。

这个原则同样适用于通用情况,即多个应用程序线程、多个后台GC线程运行于多CPU的系统上。如果操作系统无法在同时运行所有应用程序线程和GC后台线程,那么对CPU的竞争就会反映到应用程序线程的停顿上。
在这里插入图片描述

上面的图片展示了这个取舍是如何工作的。计算股票数据的批量应用已经运行于特定的模式,它们会将结果集保持在内存中数分钟(目的是填满整个堆);测试分别使用了CMS和Throughput垃圾收集算法。

快速小结

  1. 使用Throughput收集器处理应用程序线程的批量任务能最大程度地利用CPU的处理能力,通常能获得更好的性能。
  2. 如果批量任务并没有使用机器上所有可用的CPU资源,那么切换到Concurrent收集器往往能取得更好的性能。
  3. 算法和吞吐量测试 测试度量的目标是吞吐量时,选择GC算法的最基本的取舍跟批量任务一样,但是停顿所产生的影响却是大相径庭。CPU仍然是影响总体性能非常重要的一环

相关文章:

Java性能权威指南-总结6

Java性能权威指南-总结6 垃圾收集入门垃圾收集概述GC算法选择GC算法 垃圾收集入门 垃圾收集概述 GC算法 JVM提供了以下四种不同的垃圾收集算法: Serial垃圾收集器 Serial垃圾收集器是四种垃圾收集器中最简单的一种。如果应用运行在Client型虚拟机(Windows平台上的32位JVM或…...

群的定义及性质

群的定义 设 < G , ⋅ > \left<G,\cdot\right> ⟨G,⋅⟩为独异点&#xff0c;若 G G G中每个元素关于 ⋅ \cdot ⋅都是可逆的&#xff0c;则称 < G , ⋅ > \left<G,\cdot\right> ⟨G,⋅⟩为群 由于群中结合律成立&#xff0c;每个元素的逆元是唯一的 …...

mac电脑git clone项目时报错证书过期和权限被拒绝

mac电脑使用git clone命令克隆项目时&#xff0c;一开始一直提示证书过期 SSL certificate problem: certificate has expired 执行以下代码关掉验证后&#xff0c;解决了这个问题 找到git目录 Git\git-cmd输入命令跳转到bin目录&#xff0c;cd bin输入命令运行git.exe执行关…...

【AIGC】Photoshop AI Beta版本安装使用(永久免费)

AIGC 大爆发 Adobe近日宣布&#xff0c;Photoshop&#xff08;测试版&#xff09;应用程序发布了生成式AI绘图&#xff0c;这是世界上第一个创意和设计工作流程的副驾驶&#xff0c;为用户提供了一种神奇的新工作方式。生成式AI绘图由Adobe Firefly提供支持&#xff0c;Adobe的…...

01 云原生生态系统解读

云计算的技术革命 互联网时代的历程 云计算到底是什么 云计算历程 云平台的优缺点 优势 稳定性&#xff1a;云平台大量资源&#xff0c;分布式集群部署&#xff0c;保障服务永不宕机&#xff0c;几个9弹性扩展&#xff1a;按需索取&#xff0c;一键秒级开通需要的资源安全性&…...

Java——Java易错选择题复习(2)(计算机网络)

1. 下面关于源端口地址和目标端口地址的描述中&#xff0c;正确的是&#xff08; &#xff09; A. 在TCP/UDP传输段中&#xff0c;源端口地址和目的端口地址是不能相同的 B. 在TCP/UDP传输段中&#xff0c;源端口地址和目的端口地址必须是相同的 C. 在TCP/UDP传输段中&#xff…...

【HTML5系列教程】

《HTML5系列教程》目录大纲&#xff1a; 介绍 内容包括HTML简介、服务器的概念、B/S、C/S软件架构、前端与后端的开发内容、HTML发展历程、浏览器内核介绍、Web标准、WebStorm工具的使用、WebStorm常用快捷键、HTML常用标签 如&#xff1a;文本标签(span)、排版标签(div/p/h…...

二、电压源、电流源、受控源

点我回到目录 目录 理想电压源 理想电流源 受控源 电流源做功问题 电压源做功问题 理想电压源 •定义&#xff1a;两端电压保持定值或一定的时间函数&#xff0c;且电压值与流过它的电流i无关 •特点&#xff1a;理想电压源两端的电压由本身决定&#xff0c;与外电路无关…...

骨传导是哪个意思,推荐几款性能优的骨传导耳机

​骨传导耳机是通过头部骨迷路传递声音&#xff0c;而不是直接通过耳膜的振动来传递声音。与传统的入耳式耳机相比&#xff0c;骨传导耳机不会堵耳朵&#xff0c;在跑步、骑车等运动时可以更好的接收外界环境音&#xff0c;保护听力&#xff0c;提升安全性。此外&#xff0c;骨…...

利用Taro打造灵活的移动App架构

最近公司的一些项目需要跨端框架&#xff0c;技术老大选了Taro&#xff0c;实践了一段时间下来&#xff0c;愈发觉得Taro是个好东西&#xff0c;所以在本篇文章中稍微介绍下。 什么是Taro&#xff1f; Taro&#xff08;或称为Taro框架&#xff09;是一种用于构建跨平台应用程…...

(转载)基于模拟退火算法的TSP问题求解(matlab实现)

1 理论基础 1.1 模拟退火算法基本原理 模拟退火(simulated annealing,SA)算法的思想最早是由Metropolis等提出的。其出发点是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法&#xff0c;其物理退火过程由以下三部分组成&am…...

splitpcap 使用说明

背景 当PCAP原始文件特别巨大的时候&#xff0c;整个文件直接载入内存是相当耗时的&#xff0c;于是一个简单的想法是将大的PCAP切分成若干小PCAP。对于这个任务&#xff0c;现有工具splitcap是可以完成的。无论是按照主机对、还是按照五元组信息切分&#xff0c;splitcap都会…...

配置docker阿里云镜像加速

默认情况下docker安装镜像文件是从docker官方的镜像中心下载&#xff1a;https://hub.docker.com/ &#xff0c; 有时速度慢&#xff0c;可以通过配置docker阿里云镜像来加速&#xff0c;配置后&#xff0c;就从国内阿里云下载。 注册阿里云用户&#xff0c;登录->工作台-&g…...

《消息队列高手课》课程学习笔记(八)

如何实现高性能的异步网络传输&#xff1f; **异步与同步模型最大的区别是&#xff0c;同步模型会阻塞线程等待资源&#xff0c;而异步模型不会阻塞线程&#xff0c;它是等资源准备好后&#xff0c;再通知业务代码来完成后续的资源处理逻辑。**这种异步设计的方法&#xff0c;…...

DC电源模块在工业自动化的应用

BOSHIDA DC电源模块在工业自动化的应用 随着自动化技术的不断发展&#xff0c;DC电源模块已成为工业控制系统中不可或缺的一个组成部分。在许多自动化系统中&#xff0c;如机器人、控制器、PLC等&#xff0c;都需要使用到直流电源模块来提供稳定可靠的电源&#xff0c;以确保系…...

Java容器-集合

目录 1.Java容器概述 2.集合框架 3.Collection接口中的方法使用 4.iterator() 5.List接口 2.ArrayList、LinkedList、Vector相同点 3.不同点 1.ArrayList 2.LinkedList 3.Vector 4.Vector源码分析 5.ArrayList源码分析 6.LinkedList源码分析 6.List中的常用方法 …...

总结890

学习目标&#xff1a; 月目标&#xff1a;6月&#xff08;线性代数强化9讲2遍&#xff0c;背诵15篇短文&#xff0c;考研核心词过三遍&#xff09; 周目标&#xff1a;线性代数强化3讲&#xff0c;英语背3篇文章并回诵&#xff0c;检测 每日必复习&#xff08;5分钟&#xff…...

2023年5月青少年机器人技术等级考试理论综合试卷(二级)

青少年机器人技术等级考试理论综合试卷&#xff08;二级&#xff09;2023.6 分数&#xff1a; 100 题数&#xff1a; 45 一、 单选题(共 30 题&#xff0c; 共 60 分) 1.下图中的凸轮机构使用了摆动型从动件的是&#xff1f; &#xff08; &#xff09; A.a B.b C.c D.d 试题类…...

2023CCPC河南省赛 VP记录

感觉现在的xcpc&#xff0c;风格越来越像CF&#xff0c;不是很喜欢&#xff0c;还是更喜欢多点算法题的比赛 VP银了&#xff0c;VP银也是银 感觉省赛都是思维题&#xff0c;几乎没有算法题&#xff0c;感觉像打了场大型的CF B题很简单没开出来&#xff0c;一直搞到最后&…...

【ECCV2022】DaViT: Dual Attention Vision Transformers

DaViT: Dual Attention Vision Transformers, ECCV2022 解读&#xff1a;【ECCV2022】DaViT: Dual Attention Vision Transformers - 高峰OUC - 博客园 (cnblogs.com) DaViT&#xff1a;双注意力Vision Transformer - 知乎 (zhihu.com) DaViT: Dual Attention Vision Trans…...

Apache 配置与应用

Apache 配置与应用 一、构建虚拟 Web 主机httpd服务支持的虚拟主机类型包括以下三种: 二、基于域名的虚拟主机1&#xff0e;为虚拟主机提供域名解析方法一&#xff1a;部署DNS域名解析服务器 来提供域名解析方法二&#xff1a;在/etc/hosts 文件中临时配置域名与IP地址的映射关…...

OpenGL 纹理

1.简介 纹理是一个2D图片&#xff08;甚至也有1D和3D的纹理&#xff09;&#xff0c;它可以用来添加物体的细节&#xff1b;你可以想象纹理是一张绘有砖块的纸&#xff0c;无缝折叠贴合到你的3D的房子上&#xff0c;这样你的房子看起来就像有砖墙外表了。 为了能够把纹理映射(M…...

Jeston Orin Nnao 安装pytorch与torchvision环境

大家好&#xff0c;我是虎哥&#xff0c;Jeston Orin nano 8G模块&#xff0c;提供高达 40 TOPS 的 AI 算力&#xff0c;安装好了Jetpack5.1之后&#xff0c;我们需要配置一些支持环境&#xff0c;来为我们后续的深度学习开发提供支持。本章内容&#xff0c;我将主要围绕安装对…...

ROS:常用可视化工具的使用

目录 一、日志输出工具——rqt_console二、绘制数据曲线——rqt_plot三、图像渲染工具——rqt_image_view四、图形界面总接口——rqt五、Rviz六、Gazebo 一、日志输出工具——rqt_console 启动海龟键盘控制节点&#xff0c;打开日志输出工具 roscorerosrun turtlesim turtles…...

智能应用搭建平台——LCHub低代码表单 vs 流程表单 vs 仪表盘

1. LCHub低代码如何选择 「流程表单」:填报数据,并带有流程审批功能,适合报销、请假申请或其他工作流; 「表单」:填报数据,并带有数据协作功能,如修改、删除、导入、导出,并可以给不同的人不同的管理权限; 「仪表盘」:数据分析处理、结果展示功能,如数据汇总、趋…...

Mac下通过Docker安装ElasticSearch集群

1、安装ElasticSearch 使用docker直接获取es镜像&#xff0c;执行命令docker pull elasticsearch:7.7.0 执行完成后&#xff0c;执行docker images即可看到上一步拉取的镜像。 2、创建数据挂在目录&#xff0c;以及配置ElasticSearch集群配置文件 创建数据文件挂载目录 mkdir -…...

MySQL redo log、undo log、binlog

MySQL是一个广泛使用的关系型数据库管理系统&#xff0c;它通过一系列的日志来保证数据的一致性和持久性。在MySQL中&#xff0c;有三个重要的日志组件&#xff0c;它们分别是redo log&#xff08;重做日志&#xff09;、undo log&#xff08;回滚日志&#xff09;和binlog&…...

文件包含漏洞

一、原理解析。 开发人员通常会把可重复使用的函数写到单个文件中&#xff0c;在使用到某些函数时&#xff0c;可直接调用此文件&#xff0c;而无须再次编写&#xff0c;这种调用文件的过程被称为包含。 注意&#xff1a;对于开发人员来讲&#xff0c;文件包含很有用&#xf…...

Python 中的 F-Test

文章目录 F 统计量和 P 值方差(ANOVA) 分析中的 F 值 本篇文章介绍 F 统计、F 分布以及如何使用 Python 对数据执行 F-Test 测试。 F 统计量是在方差分析检验或回归分析后获得的数字&#xff0c;以确定两个总体的平均值是否存在显着差异。 它类似于 T 检验的 T 统计量&#xf…...

Docker网络模式

一、docker网络概述 1、docker网络实现的原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c; 同时Docker网桥是 每个容器的…...

vs做网站示例/品牌推广方案

大话设计模式 1 状态模式&#xff08;State&#xff09;结构图 2 对状态模式的一些解释 概念&#xff1a;当一个对象的内在状态改变时允许改变其行为&#xff0c;这个对象看起来像是改变了其类。状态模式主要解决的是档控制一个对象状态转换的条件表达式过于复杂的情况。把状态…...

百度收录网站/百度快照是啥

在IOS开发中&#xff0c;变量的声明有2种比较常用&#xff0c;我这里说说它们的区别&#xff1a;一般大家喜欢在头文件中声明property&#xff0c;然后在m文件synthsize&#xff0c;dealloc中release。这种做法比较多&#xff0c;但很多新手不知道其中的风险&#xff0c;这里解…...

css做网站/线上营销怎么推广

linux下添加用户有两个命令&#xff0c;一个是useradd&#xff0c;另一个是adduser&#xff0c;这虽然看起来差不多&#xff0c;但是差别很大&#xff0c;useradd只添加用户什么都不做&#xff0c;而adduser在添加用户的同事还在/home下为用户建立归属文件夹&#xff0c;并在里…...

大型网站开发实战/网络营销手段

刚从微博上看到&#xff0c;大家来围观一下吧~ -------------------------------------------------------------------------------------------------------------------- 我怀着复杂的心情来发这个贴&#xff0c;告诉大家一个你根本就不知道的敦煌&#xff01;王树彤总裁&am…...

个人可以做导购网站吗/百度浏览器官网

为什么mysql要使用主从模型发布时间&#xff1a;2020-05-09 10:38:05来源&#xff1a;亿速云阅读&#xff1a;172作者&#xff1a;三月本文主要给大家介绍为什么mysql要使用主从模型&#xff0c;文章内容都是笔者用心摘选和编辑的&#xff0c;具有一定的针对性&#xff0c;对大…...

深圳论坛网站设计哪家公司好/竞价推广网络推广运营

我们先用一个小表来&#xff0c;来说明一下&#xff0c;oracle执行计划该注意哪些地方。 hrORCL> set autotrace traceonly hrORCL> select * from t;模糊比较两条sql的优劣时&#xff0c;建议先查看以下两个值&#xff1a; Cost (%CPU)&#xff1a;cpu代价&#xff0c;…...