JVM调优-GC基本原理和调优关键分析

JVM基础 一什么是JVM? JVM就是java虚拟机,java做为一个跨平台的语言 阅读详情

1.写在前面

今天我们分享一下:垃圾回收算法,和调优的关键指标,等内容。

2.JVM的GC基本原理

2.1 什么是垃圾?

在内存中没有被引用的对象就是垃圾(一次请求会在内存中创建出很多的对象,这些对象不会自己消失,必须进行垃圾回收,当然垃圾回收器是jvm自己提供的。)

(特别注意:高并发的场景下,内存中尤其会创建海量的对象,这些对象所占用的内存必须及时被释放,否则影响程序性能)

一个对象引用消失了,那么这个对象就变成垃圾;因此这个对象必须被垃圾回收器回收;

那说到这里,我们就会有疑问了,怎样判断一个对象,将会成为垃圾呢?

别急,且听哥们一一道来!!!接着往下。

2.2 如何找到这个垃圾?

Jvm中有 2 种寻找垃圾对象的方案:

1 、引用计数算法

2 、根可达算法 ----- hotspot垃圾回收器都是使用这个算法

1) 引用计数算法:

通过引用计数方法,找到这个垃圾:

当这个对象引用都消失了,消失一个计数减一,当引用都消失了,计数就会变为0.此时这个对象就会变成垃圾。

这样,会存在问题:

在堆内存中主要的引用关系有如下三种:

  • 单一引用
  • 循环引用
  • 无引用

由此可见,引用计数算法不能解决循环引用问题。为了解决这个问题,Java使用了根可达分析算法。

循环引用,使用这个算法,是无法解决的。

那就引出了另外一种算法:根可达算法

2) 根可达算法:

hotspot 目前使用的主要的垃圾回收器的算法,因为引用计数无法解决循环引用计数的问题。

根可达分析算法的基本思想是: 通过一系列名为"GC roots"的对象作为起始点,从这个被称为GC roots的对象开始,向下搜索,如果一个对象到GC roots没有任何引用链相连时,说明此对象不可用。

也即给定一个集合的引用作为根出发,通过引用关系遍历对象图,能够遍历到的(可到达)对象就被判定为存活,没有则自然被判定为死亡。

所谓的"GC roots"对象起始点,或者说tracing GC的"根集合"就是一组必须活跃的引用。

通过根可达算法,我们已经找出垃圾对象了,接下来,就是清除垃圾。

如何清除垃圾呢?这里JVM提供3种算法。且听哥们一一道来!!!

2.3 如何清除垃圾?

JVM提供 3 种方法,清除垃圾对象

  1. Mark-Sweep 标记清除算法
  2. Copying 拷贝算法
  3. Mark-Compact 标记压缩算法

Mark-Sweep 标记清除算法

  • 缺点:内存存储空间碎片化

Copying 拷贝算法

为了解决效率问题,Copying 拷贝算法将可用内存按容量划分为大小相等的两块,每次只使用其中一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为了原来的一半。

  • 优点:没有碎片化,所有的有用的空间都连接在一起,所有的空闲空间都连接在一起
  • 缺点:存在空间浪费。

Mark-Compact 标记压缩算法

标记压缩算法,把存活对象拷贝到可回收的空间,然后把存活对象空间进行压缩,串联起来,把未使用的对象空间串联起来,组成连续的内存空间,这样就不会有碎片。

  • 缺点:性能较低,因为除了拷贝对象以外,还需要对象内存空间进行压缩,所以性能较低。

2.4 用什么清除垃圾

有 7 种不同的垃圾回收器,它们分别用于不同分代的垃圾回收。

  • 新生代回收器:Serial、ParNew、Parallel Scavenge
  • 老年代回收器:Serial Old、Parallel Old、CMS
  • 整堆回收器:G

两个垃圾回收器之间有连线表示它们可以搭配使用,可选的搭配方案如下:

新生代老年代
SerialSerial Old
SerialCMS
ParNewSerial Old
ParNewCMS
Parallel ScavengeSerial Old
Parallel ScavengeParallel Old
G1G1

3.调优关键指标

调优的最终目的都是为了应用程序使用 最小的硬件 消耗来承载更大的 吞吐量

3.1 吞吐量

重要指标之一,吞吐量是衡量系统在单位时间里面完成的工作数量。吞吐量需求通常忽略延迟或者响应时间。通常情况下,提升吞吐量需要以系统响应变慢和更多内存消耗作为代价。

  • TPS:每秒事务数
  • Throughput:吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机总共运行了 100 分钟,其中垃圾收集花掉 1 分钟,那吞吐量就是99%。

3.2 延迟或响应时间

延迟或者响应时间是衡量应用从接收到一个任务到完成这个任务消耗的时间。一个延迟或者响应时间的需求需要忽略吞吐量。通常来讲,提升应用的响应时间需要以更低吞吐量或提高应用的内存消耗。

延迟或者响应时间例子:"例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间。"

3.3 内存占用

内存占用是衡量应用消耗的内存,这个内存占用是指应用在运行在某一个吞吐量、延迟以及可用性和易管理性指标下的内存消耗,内存占用是通常描述为应用运行的时候Java堆的大小或者总共需要消耗内存。

通常情况下,通过增加Java堆的大小以增加应用内存占用可以提升吞吐量或者减少延迟,或者两者兼具。当应用可用的内存减少的时候,吞吐量和延迟通常会受到损失。在给定内存的情况下,应用占用的内存可以限制应用的实例数(这个会影响可用性)。

内存占用需求例子:“这个应用会单独运行在一个8G的系统上面或者多出 3 个应用实例运行在一个24G的应用系统上面。”

JDK17的GC调优策略 ​ 我们第一个JVM性能调优专题,到这里就结束了。但是,JVM底层的这些知识,其实就像是武林高手的内功,见面三招可能用不上,但是,越往后越能体现他的价值。这些经过时间沉淀下来的经验,才是程序员最不可替代的核心竞争力。​ 关于JVM部分,我们这一期的课程暂告一段落,但是,大家的学习并没有结束。对于大家以后的JVM学习,我给大家三条具体的学习建议。 阅读详情

相关推荐

LoRa模块选型指南:正点原子ATK-LORA-01与SX1278芯片深度评测(含实测距离/功耗数据)

本文深度评测了正点原子ATK-LORA-01与SX1278芯片的性能表现,通过实测数据展示其在复杂环境中的通信距离与功耗表现。特别适合智慧农业、工业监测等物联网应用场景,提供详细的配置指南和优化技巧,帮助开发者实现高效、低功耗的LoRa通信解决方案。

weixin_29191081的博客 290

JVM 根可达算法

Java中"垃圾"通常指的是不再被程序使用和引用的对象,具体表现在没有被栈、JNI指针和永久代对象所引用的对象。Java作为一种面向对象的编程语言,它使用自动内存管理机制,其中垃圾收集器负责检测和回收不再被程序引用的对象,以释放它们占用的内存空间。以下是一些导致对象成为垃圾的常见情况:无引用对象: 当一个对象没有任何引用指向它时,它就变得不可达,成为垃圾,Java的垃圾收集器会识别这样的对象,并将它们回收。

zhexiao 1105

从原理到实践:MIPI D-PHY v1.2的HS-Deskew功能全解析(附时序图详解)

本文深入解析MIPI D-PHY v1.2的HS-Deskew功能,从技术背景到实现机制,详细介绍了其在2.5Gbps高速传输中的关键作用。通过时序图详解和实测数据,帮助工程师理解并应用这一技术,解决信号完整性问题,提升系统可靠性。

weixin_30300225的博客 308

引用计数 vs 根可达算法:深入比较对象存活判定

该篇博文讲解判定对象是否存活的条件通过什么方式去做的,引用计数器算法、根可达算法,在引用计数器算法中,通过简单的案例来演示在 Java 程序中并未通过该算法来判定对象是否存活,而是通过根可达算法去作判别的,罗列了 Java GC Roots 不同的种类,简要阐述了为下文作铺垫的垃圾回收算法、垃圾收集器,希望能先带你一起了解这方面的前置知识!

vnjohn 博主 > 主线分享后端领域业务设计知识、源码思想、架构设计 4394

海康视觉平台VisionMaster通讯实战:三种触发方式深度解析

本文深度解析海康视觉平台VisionMaster的三种通讯触发方式:字符串触发、接收字符串事件触发和轮询D地址触发。通过实际案例和配置技巧,帮助工程师在工业场景中实现高效、稳定的设备通讯,提升视觉系统的集成效率和可靠性。

weixin_42665255的博客 281

手把手教你用RC桥式振荡器生成1Hz-1MHz正弦波(附完整电路图)

本文详细介绍了如何从零构建RC桥式振荡器,实现1Hz-1MHz正弦波的生成。通过核心元件选型、参数设计、电路搭建与优化等步骤,帮助读者掌握振荡器的工作原理和实战技巧。特别适合电子实验和信号处理领域的初学者和工程师,附完整电路图和常见问题解决方案。

weixin_30338481的博客 467

根可达性算法:是什么、怎么做、为什么

1、是什么 根可达性算法是JVM中一种判断对象是否回收的算法,基本思路就是通过一系列名为”GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。 2、怎么做 基本思想是通过一系列称为“GC Roots”的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象

qq_39691723的博客 1976

STM32F407与AD7766实战:如何用SPI+DMA实现高速ADC数据采集(附完整代码)

本文详细介绍了如何利用STM32F407的SPI接口与DMA控制器,高效稳定地驱动24位高精度ADC芯片AD7766,实现高速连续数据采集。通过对比传统中断方式的瓶颈,阐述了SPI+DMA方案如何大幅降低CPU负载,并提供了从硬件设计、CubeMX配置到核心驱动代码的完整实战指南,帮助工程师解决高速ADC数据采集中的性能难题。

weixin_29281941的博客 188

可达性算法、Java引用 详解

转自 https://www.jianshu.com/p/8f5fa8288d9b   在堆里存放着几乎多有的java对象实例,垃圾搜集器在对堆进行回收之前,第一件事情就是确定这些对象之中哪些还“存活”着(即通过任何途径都无法使用的对象)。 一、可达性分析算法 在Java中,是通过可达性分析(Reachability Analysis)来判定对象是否存活的。该算法的基本思路就是通过一些被称...

wowwilliam0的博客 1039

Chrome更新出现错误代码3: 0X80070422 -- system level的解决方案

本文主要介绍了Chrome更新出现错误代码3: 0X80070422 – system level的解决方案,希望能对使用Chrome的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

8、音频运行时系统的架构设计

本文深入探讨了音频运行时系统的分层设计及其优势,包括逻辑层和物理层的功能划分。通过分层设计,开发者可以更轻松地管理和优化音频资源,确保其在不同平台上的高效运行。文章还介绍了平台适配与优化、错误处理与调试以及未来发展方向等内容,为开发者提供了宝贵的参考和指导。

juice的博客 461

jvm调优

一、jvm内存调优 主要的目的是减小GC的频率和Full GC的次数。 1.Full GC 会对整个堆进行整理,包括Young、Tenured和Perm。Full GC由于须要对整个堆进行回收,因此比较慢,所以应该尽量减小Full GC的次数。数组 2.致使Full GC的缘由缓存 1)年老代(Tenured)被写满服务器 调优时尽可能让对象在新生代GC时被回收、让对象在新生代多存活一段时间和不要建立过大的对象及数组避免直接在旧生代建立对象 。并发 2)持久代Pemanet Generation空间不

白大锅的博客,毕设WangLoveBai_999 12万+

Keras深度学习实战(32)——基于LSTM预测股价

股价预测是时间序列预测中最具挑战性的问题之一,研究股价预测问题具有重要的理论意义和应用价值。针对循环神经网络在股价预测中存在的长期依赖等缺点,本文引入了长短时记忆神经网络以提高股价预测的效果。同时,我们把有关公司的新闻标题的文本数据作为模型的输入变量时,发现预测效果更好,因此我们可以把有关公司的新闻标题的文本数据作为一个有效的输入变量。最后,通过利用 Keras 实现了以上两个股价预测模型,并进行了性能分析和对比。

盼小辉丶的博客 1万+

【JVM调优】如何进行JVM调优?一篇文章就够了!

深入解读JVM性能的监控、定位和调优方案,阐述jps/stat/jstack、MAT等常用性能分析工具的使用,提出JVM参数、内存溢出、内存泄漏、CPU飙升、GC频繁等实际场景下JVM调优的方案。

种一棵树最好的时间是十年前,其次是现在 4万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JVM性能调优的6大步骤,及关键调优参数详解

JVM性能调优的6大步骤,及关键调优参数详解JVM性能调优方法和步骤1.监控GC的状态2.生成堆的dump文件3.分析dump文件4.分析结果,判断是否需要优化5.调整GC类型和内存分配6.不断分析和调整JVM调优参数参考 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。 1.Full GC 会对整个堆进行整理,包括Young、Tenured和Perm。Full GC因...

u013030086的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【JVM】GC调优(优化JVM参数)、性能调优

GC调优的主要目标是避免由垃圾回收引起程序性能下降。常见的GC模式。GC调优的手段。 性能调优解决CPU占用率高,接口响应时间长,线程不可用、死锁,判断方法耗时

奶酪的博客 3931

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

深入JVM:全面解析GC调优

本文小豪将带大家学习GC调优,了解常见的GC监控和日志分析工具,通常GC性能的评判指标包含三个方面,分别是吞吐量、暂停时间和内存占用,但往往三者不可兼得,一般更为关注其中的吞吐量和暂停时间。而GC调优主要是针对垃圾回收的性能优化,减少产生Full GC的频率和次数,一般我们可以从调整JVM内存大小、择优垃圾回收器和优化垃圾回收器参数这三方面入手优化。

Code豪客 2062

GC如何调优?

写在前面 本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定Java虚拟机 解答 谈到调优,这一定是针对特定场景、特定目的的事情, 对于 GC 调优来说,首先就需要清楚调优的目标是什么? 从性能的角度看,通常关注三个方面,内存占用(footprint)、延时(latency)和吞吐量(throughput),大多数情况下调优会侧重于其中一个或者两个方面的目标,很少有情况可以兼顾三个不同

Shockang的博客 1万+

JVM-GC调优

1、压力比较大的服务中,尽量不要存放大量的缓存或者定时任务,会影响到服务的内存使用。2、内存分析发现有大量线程创建时,可以使用导出线程栈来查看线程的运行情况。3、如果请求确实创建了大量的内存超过了内存上限,只能考虑减少请求时创建的对象,或者使用更大的内存。4、推荐使用g1垃圾回收器,并且使用较新的JDK可以获得更好的性能。

埃泽漫笔 1591

Java 性能调优实战:JVM 参数配置与 GC 日志分析

Java 性能调优是一个系统工程,涉及 JVM 参数配置、GC 日志分析、线程管理、内存优化等多个方面。通过合理配置 JVM 参数和分析 GC 日志,可以有效提升 Java 应用的性能,减少 GC 停顿时间,提高系统吞吐量和响应能力。在实际应用中,开发者和运维人员应结合业务需求和性能瓶颈,灵活调整 JVM 参数,并借助 GC 日志分析工具深入挖掘性能问题。随着 Java 技术的发展,G1、ZGC 等新一代垃圾回收器为性能调优提供了更多选择,合理选择垃圾回收器并优化其配置,是提升 Java 应用性能的关键。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

JVM调优及举例

参数功能-Xms和-Xmx设置初始和最大堆大小新生代与老年代的比例Eden区与Survivor区的比例启用G1垃圾收集器G1的最大GC暂停时间目标输出详细GC日志OOM时生成内存转储文件通过以上案例和参数配置,结合实际业务特点,可以针对性地优化JVM性能。需要注意的是,调优是一个持续的过程,应结合监控数据不断调整。Full GC频繁通常是内存管理的信号灯,分析GC日志和应用行为是定位问题的关键。根据具体场景调整堆内存、GC策略和代码逻辑,能有效降低Full GC的发生频率。

itsniu的博客 2593

JVM实战篇:GC调优

JVM实战篇:GC调优

qq_62767608的博客 2657

JDK 17 之 JVM调优 史诗级 教程

JDK 17 之 JVM调优 史诗级 教程 1 调优层次 2 调优指标 3 JVM调优原则 3.1 优先原则 3.2 堆设置 3.3 年轻代设置 3.4 老年代设置 3.5 方法区设置 3.6 GC设置 3.6.1 GC发展阶段 3.6.2 G1的适用场景 3.6.3 其他收集器适用场景 4 JVM调

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 1万+
上一篇: Java 中常用的进制转换
下一篇: Java中的抽象类与接口介绍
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值