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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Servlet详解(从xml到注解)

文章目录 概述介绍作用 快速入门Servelt的执行原理执行流程:执行原理 生命周期概述API 服务器启动,立刻加载Servlet对象(理解)实现Servlet方式(三种)实现Servlet接口实现GenericServlet抽象类,只重写service方法实现HttpServlet实现类实现Htt…

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…

【AI】ONNX

长期更新,建议收藏关注! 友情链接 Netron 开放神经网络交换(Open Neural Network Exchange)简称ONNX,是微软和Facebook提出用来表示深度学习模型的开放格式。所谓开放就是ONNX定义了一组和环境,平台均无关的标准格式…

内网安全-代理Socks协议路由不出网后渗透通讯CS-MSF控制上线简单总结

我这里只记录原理,具体操作看文章后半段或者这篇文章内网渗透—代理Socks协议、路由不出网、后渗透通讯、CS-MSF控制上线_内网渗透 代理-CSDN博客 注意这里是解决后渗透通讯问题,之后怎么提权,控制后面再说 背景 只有win7有网,其…

分层图像金字塔变压器

文章来源:hierarchical-image-pyramid-transformers 2024 年 2 月 5 日 本文介绍了分层图像金字塔变换器 (HIPT),这是一种新颖的视觉变换器 (ViT) 架构,设计用于分析计算病理学中的十亿像素全幻灯片图像 (WSI)。 HIPT 利用 WSI 固有的层次结…

Git系列:如何为不同的Git仓库设置不同的配置项?

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

毫米波雷达原理(含代码)(含ARS548 4D毫米波雷达数据demo和可视化视频)

毫米波雷达原理 1. 传统毫米波雷达1.1 雷达工作原理1.2 单目标距离估计1.3 单目标速度估计1.4 单目标角度估计1.5 多目标距离估计1.6 多目标速度估计1.7多目标角度估计1.7 总结 3. FMCW雷达数据处理算法4. 毫米波雷达的目标解析(含python代码)5. ARS548 4D毫米波雷达数据demo(含…

企业定制AI智能名片商城小程序:重塑营销场景,引领数字化营销新纪元

在数字化时代的浪潮中,多企业AI智能名片商城小程序以其独特的魅力和创新的功能,为消费者带来了前所未有的购物体验。它不仅是一个汇聚各类商品的购物平台,更是一个充满活力和创造力的社群生态。通过强化社群互动、鼓励用户生成内容以及引入积…

【RAG 博客】Haystack 中的 DiversityRanker 与 LostInMiddleRanker 用来增强 RAG pipelines

Blog:Enhancing RAG Pipelines in Haystack: Introducing DiversityRanker and LostInTheMiddleRanker ⭐⭐⭐⭐ 文章目录 Haystack 是什么1. DiversityRanker2. LostInTheMiddleRanker使用示例 这篇 blog 介绍了什么是 Haystack,以及如何在 Haystack 框…

加州大学欧文分校英语中级语法专项课程03:Tricky English Grammar 学习笔记

Tricky English Grammar Course Certificate Course Intro 本文是学习 https://www.coursera.org/learn/tricky-english-grammar?specializationintermediate-grammar 这门课的学习笔记 文章目录 Tricky English GrammarWeek 01: Nouns, Articles, and QuantifiersLearning …

WAAP动态安全解决方案

随着企业数字化进程不断加速,应用安全面临多重威胁,新型攻击方式层出不穷,常见的攻击形式包括Web应用攻击、DDoS攻击、API攻击、恶意爬虫攻击等。企业正面临严峻的安全防护挑战,需寻找一个可靠、全面的安全解决方案。在此情况下&a…

基于双层优化的电动汽车优化调度研究(附matlab程序)

基于双层优化的电动汽车优化调度研究 0.代码链接 基于双层优化的电动汽车优化调度研究(matlab程序)资源-CSDN文库 1.简述 关键词:双层优化 选址定容 输配协同 时空优化 参考文档:《考虑大规模电动汽车接入电网的双层优化调度策略_胡文平》…

【 书生·浦语大模型实战营】学习笔记(六):Lagent AgentLego 智能体应用搭建

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、…

Redis 实战之对象

Redis 实战 - 对象 对象的类型与编码类型编码和底层实现 字符串对象编码的转换字符串命令的实现 列表对象编码转换列表命令的实现 哈希对象编码转换哈希命令的实现 集合对象集合命令的实现 有序集合对象编码的转换有序集合命令的实现 类型检查与命令多态类型检查的实现多态命令…

嵌入式全栈开发学习笔记---C语言笔试复习大全7(编程题1~8)

目录 1、200~300之间能被3整除的数,5个一行输出; 2、求两个数的最大公约数、最小公倍数; 3、输入十个数,求出平均值; 4、通过编程实现,统计1~n有多少个9; 5、有1、2、3、4个数字&#xff0…

开源AI智能名片与B2B2C商城系统:打造私域流量的会员体系新篇章

在数字化浪潮的推动下,企业如何高效利用私域流量、构建强大的会员体系成为了市场竞争的关键。AI智能名片与B2B2C商城系统的结合,为企业提供了一个全新的解决方案。通过智能名片的个性化推荐和商城系统的精准营销,企业能够更有效地触达和沟通私…

ApiHug 官方站点

🤗 ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱,有温度,有质量,有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplacehttps://…

计算机等级考试2级(Python)知识点整理

计算机等级考试2级(Python)知识点整理 1.基础知识点(记忆、理解) 第1讲Python概述 01. 源代码 02. 目标代码 03. 编译和解释 04. 程序的基本编写方法 第2讲 Python语言基础(一) 01. 用缩进表示代码…

tomcat打开乱码修改端口

将UTF-8改成GBK 如果端口冲突,需要修改tomcat的端口

AJ-Report开源数据大屏 verification;swagger-ui RCE漏洞复现

0x01 产品简介 AJ-Report是一个完全开源的BI平台,酷炫大屏展示,能随时随地掌控业务动态,让每个决策都有数据支撑。多数据源支持,内置mysql、elasticsearch、kudu等多种驱动,支持自定义数据集省去数据接口开发,支持17+种大屏组件,不会开发,照着设计稿也可以制作大屏。三…