Java 性能调优:优化 GC 线程设置

news/2024/11/15 19:54:04/文章来源:https://www.cnblogs.com/JavaEdge/p/18417342

垃圾回收器使用一组称为 GC 线程的线程来执行回收工作。有时 JVM 可能会分配过多或过少的 GC 线程。本文将讨论 JVM 为什么会出现这种情况、其影响以及可能的解决方案。

1 咋查找应用程序的 GC 线程数量

进行线程转储分析来确定应用程序的 GC 线程数量:

  1. 从生产服务器捕获thread dump
  2. 使用thread dump分析工具进行分析
  3. 立即显示 GC 线程数量,如图

还可通过 JMX(Java Management Extensions)或VisualVM、JConsole 等查看 GC 线程数量。

2 咋设置 GC 线程数量?

JVM 参数手动调整 GC 线程数:

  • -XX:ParallelGCThreads=n:设置垃圾回收器并行阶段使用的线程数量
  • -XX:ConcGCThreads=n:控制垃圾回收器并发阶段使用的线程数量

注意这些参数适用于并行垃圾回收器(如 ParallelGC 和 ParallelOldGC)和并发垃圾回收器(如 G1GC)。

3 默认 GC 线程数量多少?

根据服务器或容器中的 CPU 数量自动计算。

  • -XX:ParallelGCThreads 默认值:在 Linux/x86 系统上,默认值公式:
if (处理器数量 <=8) {   返回处理器数量; 
} else {  返回 8 + (处理器数量 - 8) * (5/8); 
}

因此,如果 JVM 运行在拥有 32 个处理器的服务器上,那么 ParallelGCThread 的值将是 23。

  • -XX:ConcGCThreads 默认值:公式:
max((ParallelGCThreads+2)/4, 1)

因此,如果 JVM 运行在 32 个处理器的服务器上:

  • ParallelGCThread 的值将是 23(即 8 + (32 – 8) * (5/8))
  • ConcGCThreads 的值将是 6(即 max(25/4, 1))

4 JVM 会分配过多的 GC 线程吗?

JVM 可能在你不知情下分配过多 GC 线程。因为默认 GC 线程数量是根据服务器或容器中的 CPU 数量自动确定。

如在拥有 128 个 CPU 机器,JVM 可能会为垃圾回收的并行阶段分配大约 80 个线程,并为并发阶段分配大约 20 个线程,总计 100 个 GC 线程。

如你在这台 128 CPU 的机器上运行多个 JVM,每个 JVM 可能会分配大约 100 个 GC 线程。这会导致资源的过度使用,因为所有这些线程都在争夺相同的 CPU 资源。这种情况在容器化环境中特别常见,因为多个应用程序共享相同的 CPU 核心,导致 JVM 分配的 GC 线程超过所需数量,从而降低整体性能。

容器化环境

JVM 可能根据容器分配的 CPU 资源来计算 GC 线程数量,而非物理机器的 CPU 数量。这可能导致在共享 CPU 资源的容器环境中分配过多的 GC 线程。

5 过多GC线程也是问题?

虽然 GC 线程对高效的内存管理非常重要,但过多 GC 线程可能会导致 Java 应用程序性能问题。

上下文切换增加

当 GC 线程过多时,操作系统需要频繁地在这些线程之间切换,导致上下文切换的开销增加,更多的 CPU 时间花在管理线程上,而不是执行应用程序代码,结果应用程序可能会明显变慢。

CPU 开销增加

每个 GC 线程都会消耗 CPU 资源,过多的线程同时活跃时,它们会争夺 CPU 时间,减少应用程序的主要任务的处理能力,特别是在 CPU 资源有限的情况下。

内存争用

过多的 GC 线程会增加内存资源争用,多个线程同时访问和修改内存会导致锁争用,从而进一步降低应用程序性能。

GC 暂停时间增加,吞吐量下降

过多的 GC 线程会使垃圾回收过程低效,导致更长的 GC 暂停时间,应用程序会被暂时中断,延长的暂停时间可能会造成明显的延迟或卡顿。此外,更多的时间花在垃圾回收上而不是处理请求,应用程序的整体吞吐量会下降,从而影响其在高负载下的扩展性和性能。

延迟增加

由于过多线程导致 GC 活动增加,响应用户请求或处理任务的延迟也会增加,这对需要低延迟的应用程序来说尤其严重,例如实时系统或高频交易平台。

边际效益递减

增加 GC 线程到一定程度后,并不会继续提高性能,反而会出现边际效益递减,管理这些线程的开销超过了更快垃圾回收的好处,这会导致应用性能下降。

6 过少GC线程还是问题?

过少的 GC 线程同样会给 Java 应用程序带来问题。原因如下:

  1. 垃圾回收时间延长:GC 线程过少时,垃圾回收所需时间变长,线程少,处理时间长,GC 暂停时间也随之延长。
  2. 应用程序延迟增加:垃圾回收时间过长会增加应用程序的延迟,特别是对于需要低延迟的应用程序,用户可能会感到应用程序无响应。
  3. 吞吐量降低:GC 线程数量不足会导致垃圾回收器工作效率降低,进而影响整体吞吐量,应用程序每秒处理的请求或事务变少,影响其扩展能力。
  4. CPU 利用率低下:线程过少时,CPU 核心可能无法充分利用,部分核心闲置,部分核心负载过重,资源利用率不均衡。
  5. 增加OOM和内存泄漏风险:GC 线程过少可能导致垃圾回收器无法跟上内存分配的速度,回收不及时,可能出现OOM,甚至导致内存泄漏和崩溃。

7 优化 GC 线程数的解决方案

若应用程序因 GC 线程数量不当导致性能问题,可通过 JVM 参数手动调整 GC 线程数:

  • -XX:ParallelGCThreads=n
  • -XX:ConcGCThreads=n

在生产环境中应用这些更改前,先研究应用程序的 GC 行为,收集并分析 GC 日志。根据分析结果,判断当前线程设置是否导致性能瓶颈,然后进行相应调整。

务必在受控环境中测试这些更改,以确保它们的确能改善性能,然后再应用于生产环境。调整 GC 线程数量时,应结合应用程序的实际工作负载、内存使用情况和硬件配置进行综合考虑。此外,可以使用工具如 GCViewer 来分析 GC 日志,以更好地理解 GC 行为并进行优化。

8 总结

平衡 GC 线程数量对 Java 应用程序的平稳运行至关重要。通过仔细监控和调整这些设置,可以避免潜在的性能问题,并保持应用程序的高效运行。

关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。

各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。

负责:

  • 中央/分销预订系统性能优化
  • 活动&券等营销中台建设
  • 交易平台及数据中台等架构和开发设计
  • 车联网核心平台-物联网连接平台、大数据平台架构设计及优化
  • LLM Agent应用开发
  • 区块链应用开发
  • 大数据开发挖掘经验
  • 推荐系统项目

目前主攻市级软件项目设计、构建服务全社会的应用系统。

参考:

  • 编程严选网

本文由博客一文多发平台 OpenWrite 发布!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/798676.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信授权登录接口开发

微信登陆过程 在项目开发中,难免会遇到微信授权登录这一操作,本讲来讲一下微信登陆是如何实现的? 关于校验登录,有诸多方法,记录方法如下:使用Spring MVC提供的拦截器 网关服务全局过滤器 使用AOP面向横切面实现对于使用Spring MVC提供的拦截器来实现,其大致的思路如下:注…

1 计算机系统

计算机系统抽象层次6 用户 可执行程序5 高级语言 C++ Java4 汇编语言 汇编代码3 系统软件 操作系统 /库代码2 机器 指令集架构(ISA)1 控制(控制怎么执行) 微代码 /硬连线0 数字逻辑(执行) 电路、门等Language Processor: 语言处理器 语言处理器的两个阶段:分析源程序 合成目…

人工智能生成合成内容标识办法(征求 意见稿)发布

当前国家发布的关于人工智能生成合成内容标识的法律法规有:《中华人民共和国网络安全法》、《互联网信息服务算法推荐管理规定》、《互联网信息服务深度合成管理规定》、《生成式人工智能服务管理暂定办法》等。 征求意见稿 2024年9月14日,国家网信办发布关于《人工智能生成合…

南沙信奥老师解题:1167:再求f(x,n)

​ 用递归函数求解。【输入】第一数是x的值,第二个数是n的值。【输出】函数值。【输入样例】 1 2 【输出样例】 0.40#include <iostream> #include <stdlib.h> using namespace std; double f(double x,double n) {if(n==1)return x/(1+x);elsereturn x/(n+f(x,n-…

概率分布深度解析:PMF、PDF和CDF的技术指南

本文将深入探讨概率分布,详细阐述概率质量函数(PMF)、概率密度函数(PDF)和累积分布函数(CDF)这些核心概念,并通过实际示例进行说明。 在深入探讨PMF、PDF和CDF之前,有必要先简要介绍两种常用的概率分布:正态分布和均匀分布。 正态分布: 也称为高斯分布或钟形曲线,正…

冒泡排序(重要!)

1.作用 比较数组中两个相邻的数,如果第一个数比第二个数大,则会交换位置。 每一次比较都会产出最大或是最小的数,下一轮则可以少一次排序,依次循环,直到结束 2.机制 冒泡排序分为两个循环,外层冒泡轮数(总的次数循环),而内层比较大小(两个数进行比较) 可以想象有三个…

Luogu P10812

题目描述 给定一根 \(1\) 到 \(N\) 的数轴。一开始有一个棋子在 \(N\)。每次棋子 \(x\) 可以跳到 \(x-1,x+1\) 或 \(x\) 的因子处(不能超出 \(1\) 到 \(N\))。 每个点只能到达一次。求棋子到达 \(1\) 的方案数。 思路 由于求倍数比因子简单,所以把问题变成从 \(1\) 到 \(N\)…

爬虫cookie的使用

cookie是一种由网站创建并存储在用户计算机上的小型文本文件。访问该网站时由浏览器返回给服务器。cookie主要作用是帮助网站记住用户信息,包括但不限于:会话管理,网站使用cookie识别用户的会话,以便用户在浏览网站时不需要重复登录。 个性化体验,通过存储用户的偏好设置,…

unity人工智能游戏、源码、教程(中秋特别版),完全免费和开源

三维虚拟世界的人工智能对话。 完全免费、完全开源、完整详细、通俗易懂。 我把游戏、游戏源码、教程(三合一)放到了夸克网盘: 链接:https://pan.quark.cn/s/65e22d51c1bb任何人不要和我说话,我不想跟任何人说话,因为我对现实世界的人类不感兴趣。谁跟我说话,我都不会理…

校招前的思考

又有了一次参加校招的机会,我希望校招这种活动,自己每参加一次,都能加深一次理解。校招前,我想思考清楚一个问题:企业为什么要校招?又有了一次参加校招的机会,我希望校招这种活动,自己每参加一次,都能加深一次理解。校招前,我想思考清楚一个问题:企业为什么要校招?…

江锐第一次作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/zjlg/rjjc这个作业的目标 学习博客园的基本知识,并介绍自己,自我认知姓名-学号 江锐-2022329301014一、个人简介 (1)基本信息 姓 名: 江锐 物 理 家 乡:湖北武汉 专 业: 电气工程及其自动化 网 络 家 乡:github,…

中秋快乐

最近北京的天气真不错 昨天出门,傍晚天渐渐黑了,抬头看见好圆整的月亮,才意识到中秋到了,没啥课天天放假已经对工作日假期没啥概念了。 祝大家中秋快乐! Lemon越听越很上头,特别是2019年演唱会版真的很有感觉, 还能学习一波假名。 又有点想去演唱会了,上次还是工体Shane…