当前位置: 首页 > 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…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...