听说 JVM 性能优化很难?今天我小试了一把!

听说 JVM 性能优化很难?今天我小试了一把!

作者: 陈树义 2021-06-03 08:01:12

云计算

虚拟化 对于 Java 开发的同学来说,JVM 性能优化可以说是比较难掌握的知识点。这不仅因为 JVM 性能优化需要掌握晦涩难懂的 JVM 知识,还因为 JVM 性能优化很难有使用场景。

[[403396]]

对于 Java 开发的同学来说,JVM 性能优化可以说是比较难掌握的知识点。这不仅因为 JVM 性能优化需要掌握晦涩难懂的 JVM 知识,还因为 JVM 性能优化很难有使用场景。

这导致了许多人对 JVM 性能优化不熟悉,感觉就像是空中楼阁的天物一样不可触及。这几天工作中做了一次 JVM 性能优化,我想这对于 JVM 调优的初学者会有较大帮助。

背景

我们都知道 JVM 分为了新生代和老年代,并且我们在启动应用的时候都会配置对应的参数,为应用程序运行的 JVM 调整内存大小。但我们都知道,很多时候我们都只是大致估计一个数,随便填填,然后就上线了。

作者所在的公司同样存在这种情况,JVM 内存大小基本上都设得挺大的,毕竟内存大总比内存溢出好,因此就造成了不少的内存浪费。所以作者收到的任务就是对所有的应用进行一次排查,调整合适的内存参数,优化 JVM 的性能。

调优实战

要对应用进行 JVM 性能调优,那么首先得知道其运行的情况。这就像去医院看医生,去开药之前需要医生先望闻问切一样。在 Java 中,有很多方式可以观察到 JVM 的内部情况,例如 JDK 提供的各种命令工作。作者所在公司使用的是 Prometheus 进行监控,因此我们可以直接在 Prometheus 上看到应用的 JVM 运行情况。

Prometheus 面板中与 JVM 相关的主要有四块内容:JVM Misc、JVM Memory Pools(Heap)、JVM Memory Pools(Non-Heap)、Garbage Collection。其中与我们此次较为相关的主要是:JVM Memory Pools(Heap)和 Garbage Collection。

JVM Memory Pools(Heap) 展示 JVM 堆内存的使用情况,主要包括了新生代的 Survivor 区、Eden Space 区、老年代。

JVM Memory Pools(Heap)

Garbage Collection 展示 JVM 的垃圾回收情况,主要包括垃圾回收频率(ops 表示一秒回收几次,一般 0.5 是比较合理的值)、每次 GC 停顿时长(一般 80ms 以下是合理值)、分配到新生代/晋升老年代的内存。

Garbage Collection

我们要进行 JVM 性能优化,那么最简单的一个方法就是观察 Garbage Collection 的 GC 频率以及停顿时间,我们大致就能判断出应用的内存利用效率。之后根据这两个值的实际情况,将其调整到合理的范围内,提高 JVM 的利用率。

如果一个应用的 GC 频率只有 0.02,即每秒 GC 0.02 次,那么需要 50 秒才 GC 一次,那么其 GC 频率是很低的。这时候很可能是分配了较大的新生代空间,这使得其很久才需要 GC 一次。这时候我们再看看其停顿时间,如果停顿时间也很短的话,那我们就可以判定该应用的内存有优化的空间。

在这种情况下,一般都是缩小分配的新生代的空间。新生代空间一旦变小了,那么其分配完的时间就会缩减。一旦空间被分配完,那么就会启动进行 GC 操作。从而 GC 次数就会提升,提高应用的内存利用率。

在进行内存空间调整的时候,为了避免内存剧烈波动导致的问题,一般我们都是小步快跑地一点点调整。先调整一点试一试,没太大问题之后再调整到目标值。 毕竟是生产环境,要是出了什么岔子,那就得提桶跑路了,还是谨慎为好!

看到这里,想必大家应该也知道怎么做了。接下来无非就是调整 JVM 内存空间的三个参数(-Xmx -Xms -Xmn),使 GC 频率与 GC 停顿时间处于合理的区间。

应用层面优化

除了 GC 频率、GC 停顿时间,我们还能从应用的类型来分析 JVM 的内存消耗情况。

例如对于接口类型的系统来说,很多请求都是 1 秒之内就结束。对于这种类型的请求,他们进入应用时会分配内存,结束时内存就会立刻被回收,留存下来的对象很少。这种应用的 JVM 内存情况大概是这样的:新生代消耗比较大,并且随着周期性回收内存,但老年代的内存消耗则更小。

对于那些持续性处理的应用,例如持续时间长的应用处理。因为其存活时间较久,所以可能会有更多的对象晋升到老年代,因此老年代的内存消耗就比较大。

通过观察 JVM 年轻代与老年代的内存消耗情况,再结合应用本身的特性,我们可以发现应用中不合理的地方,再对应用进行针对性的优化。例如:应用某个地方每次都会存储大量的临时数据到内容中,这样就造成了 JVM 可能爆发 GC,从而导致应用卡顿。

总结

总结一下本篇文章的调优方法:通过观察 GC 频率和停顿时间,来进行 JVM 内存空间调整,使其达到最合理的状态。调整过程记得小步快跑,避免内存剧烈波动影响线上服务。 这其实是最为简单的一种 JVM 性能调优方式了,可以算是粗调吧。但 JVM 性能调优还有更多、更详细的参数,后续有机会我们再聊聊。

此外,通过观察 JVM 年轻代与老年代的情况,也可以帮助我们对应用进行针对性的优化,从而提升应用本身的性能。

如果你之前没了解过 JVM 的基础理论知识,那么你可能看不懂这篇文章。那么我推荐你看看我的「JVM 基础入门系列」,文章由浅入深、循序渐进,可以让你对 JVM 有个感性的理解。看完之后再来看这篇文章,你肯定有种豁然开朗的感觉!

JVM 基础入门系列传送门:JVM 基础入门系列

关于 JVM 性能调优,就分享到这里吧。

本文转载自微信公众号「陈树义」,可以通过以下二维码关注。转载本文请联系陈树义公众号。

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/299620.html<

(0)
管理的头像管理
上一篇2025-05-23 11:57
下一篇 2025-05-23 11:59

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注