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

news2025/1/13 13:20:07

GC调优

GC调优的主要目标是避免由垃圾回收引起程序性能下降。

GC调优的核心指标

  1. 垃圾回收吞吐量:执行用户代码时间/(执行用户代码时间 + GC时间)
  2. 延迟:GC延迟 + 业务执行时间
  3. 内存使用量

GC调优步骤

  1. 发现问题:通过监控工具。
  2. 诊断问题:通过分析工具。
  3. 修复问题:调整JVM参数或修复源代码。
  4. 测试验证

GC调优发现问题的工具

  1. jstat:jdk自带的可以提供垃圾回收的信息。 jstat -gc 进程ID 每次统计的间隔(毫秒) 统计次数。
  2. Visualvm插件:Visual GC插件,实时监控Java进程的堆内存结构、堆内存变化趋势以及垃圾回收时间的变化趋势。适合开发环境,对程序有影响,生产环境无权限。
  3. Prometheus + Grafana:非常详细,环境复杂,运维搭建。

分析GC日志

  1. GCViewer:日志转为可视化图表 java -jar gcviewer_1.3.4.jar 日志文件.log

https://github.com/chewiebug/GCViewer

  1. GCEasy:在线的可视化工具图表

https://gceasy.io/

常见的GC模式

  1. 正常情况
  2. 缓存对象过多
  3. 内存泄漏
  4. 持续的FullGC:请求量激增,生产更多对象,gc无法跟上对象创建速率。
  5. 元空间不足:堆中内存足够
图片1

GC调优的手段

  1. 优化基础JVM参数:基础JVM参数的设置不当,会导致频繁FULLGC的产生。
  2. 减少对象产生:大多数场景下的FULLGC是由于对象产生速度过快导致的。
  3. 更换垃圾回收器:选择适合当前业务场景的垃圾回收器,减少延迟、提高吞吐量。
  4. 优化垃圾回收器参数:

优化基础JVM参数

堆、栈、元空间、垃圾回收器、堆内存快照、日志

  1. -Xmx 和 –Xms 最大堆内存、初始堆内存。根据最大并发量估算服务器的配置,然后再减去系统和其他程序所需的内存。建议一样大,减少申请内存次数。
  2. -XX:MaxMetaspaceSize 和 -XX:MetaspaceSize 最大元空间大小、第一次FULLGC的阈值(之后JVM自行计算)。
  3. -Xss 虚拟机栈大小。默认大小取决于操作系统和体系结构。Linux x86 1m。合理值256k~1m。
  4. 不建议手动设置。
    1. -Xmn 年轻代的大小,默认值为整个堆的1/3。G1会动态调整年轻代大小。
    2. -XX:SurvivorRatio 伊甸园区和幸存者区的大小比例,默认值为8。
    3. -XX:MaxTenuringThreshold 最大晋升阈值,年龄大于此值,会进入老年代。JVM有动态年龄判断机制:将年龄从小到大的对象占据的空间加起来,如果大于survivor区域的50%,把等于或大于该年龄的对象,放入到老年代。
  5. 其他参数
    1. -XX:+DisableExplicitGC 禁止在代码中使用System.gc(),因为可能会引起FULLGC。
    2. -XX:+HeapDumpOnOutOfMemoryError 发生OOM错误时,自动生成hprof内存快照文件。
    3. -XX:HeapDumpPath= 指定hprof文件的输出路径。
    4. 打印GC日志:8及之前: -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:文件路径
    5. 打印GC日志:9及之后: -Xlog:gc*:file=文件路径

JVM参数模板

-Xms1g
-Xmx1g
-Xss256k
-XX:MaxMetaspaceSize=512m 
-XX:+DisableExplicitGC-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/logs/my-service.hprof-XX:+PrintGCDetails 
-XX:+PrintGCDateStamps 
-Xloggc:文件路径

实战

保存hprof文件,Heap Hero分析文件

https://heaphero.io/

性能调优

问题:top命令CPU占用率高;单个服务处理时间特别长;程序启动后正常,一段时间后无法处理任何请求。

线程转储

线程转储(Thread Dump)提供了对所有运行中的线程当前状态的快照。

jstack 进程id
jstack 进程id > 文件名  # 导出线程栈文件

线程转储的可视化在线分析平台: 1、 https://jstack.review/ 2、 https://fastthread.io/

CPU占用率高

  1. 通过top命令找到进程和线程。
  2. 使用jstack打印线程快照。
  3. 找到线程快照正在执行的方法,并优化性能。
top -c #找到进程id
top -p 进程id #再摁H可以查看进程的线程
jstack 进程id #查看栈信息
printf ‘%x\n’ #通过16进制,在文件中查看线程信息(文件中线程id是16进制)
# 找到栈信息中源代码位置

关注状态为RUNNABLE的线程。一些线程执行本地方法时并不会消耗CPU,只是在等待。但 JVM 仍然会将它们标识成“RUNNABLE”状态。

接口响应时间长

方法1:通过arthas的trace和watch命令,监控方法的执行耗时和参数、返回值等信息,定位性能瓶颈,并优化性能。

  1. trace 类名 方法名
  2. --skipJDKMethod false 输出JDK核心包中的方法及耗时。
  3. ‘#cost > 毫秒值’ 。
  4. –n 数值 ,最多显示该数值条。
  5. stop结束监控,重置arthas增强的对象。

方法2:通过arthas的profile火焰图功能,找到火焰图中顶部较平的方法,一般就是性能问题产生的根源,并优化性能。

  1. 使用了for循环向ArrayList中添加数据。ArrayList扩容需要copyof复制老到新的数组。

线程不可用、死锁

死锁或时间长:通过jstack、visualvm、fastthread.io 等工具,找到线程死锁的原因,解决死锁问题。

使用线程快照生成工具就可以看到死锁的根源。文件中搜索deadlock

https://fastthread.io/

解决思路:

1、检测是否有死锁产生,无法自动解除的死锁会将线程永远阻塞。

2、如果没有死锁,再使用案例1的打印线程栈的方法检测线程正在执行哪个方法,一般这些大量出现的方法就是慢方法。

判断方法耗时

使用OpenJDK中的jmh基准测试框架对某些特定的方法比如加密算法进行基准测试,jmh可以完全模拟运行环境中的Java虚拟机参数,同时支持预热能通过JIT执行优化后的代码获得更为准确的数据。注意添加黑洞消费,否则会被优化。

官网地址:https://github.com/openjdk/jmhc

Date 和 LocalDateTime

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

leetcode_43.字符串相乘

43. 字符串相乘 题目描述:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 &q…

python:用 mido 生成 midi文件,用 pygame 播放 mid文件

pip install mido Downloading mido-1.3.2-py3-none-any.whl (54 kB) Downloading packaging-23.2-py3-none-any.whl (53 kB) Installing collected packages: packaging, mido Successfully installed mido-1.3.2 packaging-23.2 mido 官网文档 pip intall pygame pygame…

Jenkins(超详细的Docker安装Jenkins教程!!!)

Jenkins Jenkins,原名 Hudson,2011 年改为现在的名字。它是一个开源的实现持续集成的软件工具。 官方网站:https://www.jenkins.io/ 中文文档:https://www.jenkins.io/zh/ 为什么需要Jenkins? 我们以前写完代码&a…

SpringBoot 基础简介

目录 1. SpringBoot 概述 1.1. 为什么会有springboot 1.1.1. 传统Spring 的两个缺点 1.1.2. Springboot 功能 2. SpringBoot 快速搭建 2.1. 创建Maven项目​编辑​编辑​编辑 2.2. 导入SpringBoot起步依赖 2.3. 定义controller 2.4. 添加引导类 2.5. 启动访问 3. Sprin…

开源的 RAG 和 workflow 技术对比调研

一、先来了解一下开源的技术有哪些,怎么样 我自己就是做RAG工作的,但是还是想关注一下开源的技术做到了什么程度。 所以调研了很长时间,也体验了一下。这里写一篇文章来分享一下结果。 我用五一的假期时间,来做调研,看…

工业光源-环形无影光源-特点

产品特点 ◆采用特殊的漫射结构,使光均匀的扩散在照射区域: ◆常应用在被测物体需要均匀的的表面照明并且要避免反光或光斑的场合。

Jupyter Notebook 中使用虚拟环境的Python解释器

问题:创建虚拟环境,在pycharm中配置虚拟环境的Python解释器,然后在pycharm中打开ipynb,执行发现缺少包,但是虚拟环境中已经安装了 解决方式: 配置Jupyter Notebook 使用虚拟环境的Python解释器 1&#x…

thinkphp家政上门预约服务小程序家政保洁师傅上门服务小程序上门服务在线派单安装教程

介绍 thinkphp家政上门预约服务小程序家政保洁师傅上门服务小程序上门服务在线派单安装教程 上门预约服务派单小程序家政小程序同城预约开源代码独立版安装教程 程序完整,经过安装检测,可放心下载安装。 适合本地的一款上门预约服务小程序&#xff0…

matlab期末知识

1.期末考什么? 1.1 matlab操作界面 (1)matlab主界面 (2)命令行窗口 (3)当前文件夹窗口 (4)工作区窗口 (5)命令历史记录窗口 1.2 matlab搜索…

FIFO Generate IP核使用——AXI接口FIFO简介

AXI接口FIFO是从Native接口FIFO派生而来的。AXI内存映射接口提供了三种样式:AXI4、AXI3和AXI4-Lite。除了Native接口FIFO支持的应用外,AXI FIFO还可以用于AXI系统总线和点对点高速应用。 AXI接口FIFO不支持Builtin FIFO和 Shift Register FIFO配置。 当…

Java将文件目录转成树结构

在实际开发中经常会遇到返回树形结构的场景&#xff0c;特别是在处理文件系统或者是文件管理系统中。下面就介绍一下怎么将文件路径转成需要的树形结构。 在Java中&#xff0c;将List<String>转换成树状结构&#xff0c;需要定义一个树节点类&#xff08;TreeNode&#…

【Python编程实践1/3】模块

目录 目标 模块 import ​编辑 代码小结 题目 from...import 随机模块 代码小结 randint函数 骰子大战 choice函数 总结 目标 拧一颗螺丝&#xff0c;只会用到螺丝刀&#xff1b;但是修一台汽车&#xff0c;需要一整套汽修的工具。函数就像螺丝刀&#xff0c;可以帮…

Redis---------实现商品秒杀业务,包括唯一ID,超卖问题,分布式锁

订单ID必须是唯一 唯一ID构成&#xff1a; 代码生成唯一ID&#xff1a; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.tim…

2024年IEEE第16届先进信息通信技术国际会议(ICAIT 2024)即将召开!

2024年IEEE第16届先进信息通信技术国际会议&#xff08;ICAIT 2024&#xff09;将于2024年 8月16-19日在湖北恩施举行。先进信息通信技术作为当今世界科技发展的前沿领域&#xff0c;不仅是推动经济社会发展的重要引擎&#xff0c;也是提升国家综合竞争力的重要支撑。因此&…

EDA(一)Verilog

EDA&#xff08;一&#xff09;Verilog Verilog是一种用于电子系统设计自动化&#xff08;EDA&#xff09;的硬件描述语言&#xff08;HDL&#xff09;&#xff0c;主要用于设计和模拟电子系统&#xff0c;特别是在集成电路&#xff08;IC&#xff09;和印刷电路板&#xff08;…

AI-数学-高中53-离散型随机变量的均值与方差

原作者视频&#xff1a;【随机变量】【一数辞典】3离散型随机变量的均值与方差_哔哩哔哩_bilibili 标准差 方差开根

算法数据结构--单调栈

文章目录 介绍单调递增栈单调递减栈图示应用场景 步骤模板Deque用法例题[739. 每日温度](https://leetcode.cn/problems/daily-temperatures/)[496. 下一个更大元素 I](https://leetcode.cn/problems/next-greater-element-i/) 总结 介绍 单调栈是一种特殊的栈数据结构&#x…

Excel中怎样把单元格里的数据拆分成多行?

时常会遇到这种情况&#xff0c;需要将一个单元格里的数据分拆到多行&#xff0c;可以使用公式&#xff0c;这里演示使用基础操作的办法。 按照excel使用经验&#xff0c;可以复制数据&#xff0c;粘贴到MS Word里&#xff0c;这个是excel的同族软件&#xff0c;兼容性好。 在…

基于SSM SpringBoot vue教务排课系统

基于SSM SpringBoot vue教务排课系统 系统功能 登录 个人中心 学生信息管理 教师信息管理 课室信息管理 班级信息管理 系别信息管理 专业信息管理 课程信息管理 选课信息管理 课表信息管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: SSM(Spring SpringMVC Myba…

基于 AI 的数据库助手-Chat2DB

序言 现在已经开始步入 AI 时代&#xff0c;AI 产品也已经络绎不绝。今天&#xff0c;给大家介绍一款数据库的 AI 产品 —— Chat2DB。 一、什么是 Chat2DB Chat2DB 由阿里提供的一个数据库管理、数据开发、数据分析的工具&#xff0c;它是一个 AI 原生的数据库管理工具&…