【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

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

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

相关文章

论文研读|针对文生图模型的AIGC检测

前言:人工智能生成内容的鉴别(AIGC检测)算是当前的研究热点之一,本篇文章介绍几篇针对文生图模型的 AIGC 检测相关工作。 相关文章:AIGC溯源相关研究详见此篇文章 目录 1. Towards Universal Fake Image Detectors tha…

运动控制单位[u/s]介绍

运动控制很多手册上会写u/s这样的单位,这里的u是英文单词unit的缩写,也就是单位的意思,所以这里的单位不是微米/秒,也不是毫米/秒,这里是一个泛指,当我们的单位选择脉冲时,它就是脉冲/秒,也就是我们说的频率(HZ)。常用脉冲频率 转速 角度 弧度的互相换算大家可以参考下…

OneNote导出白色背景文件时将笔记墨迹转换颜色

今天用OneNote导出笔记时发现在文件上做的黑色墨迹笔记全部转成了白色。推测是因为onenote会根据背景色自动转换黑色和白色的墨迹,但是其他颜色好像导出的时候不会转换。 于是,我们首先要转换背景,将黑色背景转成白色背景, 然后将…

Java常用API之LinkedList类解读

写在开头:本文用于作者学习我将官方文档中LinkedList 1.6版本中类中绝大部分API全测了一遍并打印了结果,日拱一卒,常看常新。 自己补充了一些对该数据结构的理解,如有不对的地方,请各位指正,谢谢。 首先&…

GNU Radio创建FFT、IFFT C++ OOT块

文章目录 前言一、GNU Radio官方FFT弊端二、创建自定义的 C OOT 块1、创建 OOT 模块2、创建 OOT 块3、修改 C 和 CMAKE 文件4、编译及安装 OOT 块 三、测试1、grc 图2、运行结果①、时域波形对比②、频谱图对比 四、资源自取 前言 GNU Radio 自带的 FFT 模块使用起来不是很方便…

OCC笔记:选择TopoDS_Shape顶点、边、面等等

1、通过AIS_InteractiveContext的函数访问当前选择的图形 hAISContext->InitSelected(); hAISContext->MoreSelected(); hAISContext->NextSelected(); hAISContext->SelectedShape(); 其中hAISContext->SelectedShape()通过StdSelect_…

什么是g++-arm-linux-gnueabihf

2024年5月3日,周五晚上 g-arm-linux-gnueabihf 是针对 ARM 架构(ARMv7 和 ARMv8)的 Linux 系统开发的 GNU C 编译器套件,可以在 x86 或 x86_64 架构的主机上使用,用于交叉编译 ARM Linux 应用程序和库。 与 gcc-arm-l…

项目管理【环境】过程

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 【环境】概述 【环境】原则 【环境】过程 一、规划和管理项目的合规性 1.1 规划和管理项目的合规性 1.2 确认合规要求 1.3 审计:衡量合规的程度 二、项目管理计划和项目文件 2.1 项目管理计划和…

C语言 联合和枚举

目录 1. 联合体1.1 联合体类型的声明1.2 联合体变量的创建1.3 联合体的特点1.4 联合体在内存中的存储1.5 联合体使用举例 2. 枚举类型2.1 枚举类型的声明2.2 枚举变量的创建和初始化2.3 枚举类型的大小2.4 枚举类型的优点 正文开始 上次我们通过《C语言 结构体详解》学习了结构…

C语言 | Leetcode C语言题解之第66题加一

题目: 题解: /*** Note: The returned array must be malloced, assume caller calls free().*/ int* plusOne(int* digits, int digitsSize, int* returnSize){for(int i digitsSize - 1; i > 0; --i){digits[i] digits[i] 1;//最后元素1判断是不…

模版进阶篇章

非类型模版参数 回顾&#xff1a;函数模版 &#xff1a;不用传类型&#xff0c;编译器会自动推导&#xff0c;和普通的函数调用一样 #include<iostream> using namespace std; template<typename T>// T是类型 bool Less(T a, T b)// a,b是T实例化的的对象 {retu…

微信小程序开发:深入实现地图导航功能【含代码示例】

微信小程序开发&#xff1a;深入实现地图导航功能【含代码示例】 一、引言二、准备工作三、集成地图SDK四、实现地图显示五、添加标记点和路线 一、引言 微信小程序作为一种轻量级的应用程序&#xff0c;凭借其无需安装、即用即走的特点&#xff0c;迅速在移动应用市场中占据了…

笔试狂刷--Day12(模拟 + 链表的公共节点 + dp)

大家好,我是LvZi,今天带来笔试狂刷--Day12(模拟 链表的公共节点 dp) 一.删除公共字符&#xff08;哈希&#xff09; 题目链接:删除公共字符&#xff08;哈希&#xff09; 分析: 分别读取俩个字符串,将第二个字符串存储到set之中,再遍历第一个字符串,删除公共字符 代码: …

StringUtils中isBlank()和isEmpty()的区别

1.首先导入依赖common-lang3 <!--string的扩展api--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version> <!-- 请使用最新版本 --></dependency&g…

《网络安全技术 网络安全众测服务要求》

近日&#xff0c;全国网络安全标准化技术委员会发布《网络安全技术 网络安全众测服务要求》&#xff08;GB/T 43741-2024&#xff0c;以下简称“众测服务要求”&#xff09;&#xff0c;并将在2024年11月1日正式实施。 《众测服务要求》确立了网络安全众测服务的角色及其职责&…

ruoyi漏洞总结

若依识别 黑若依 :icon hash"-1231872293 绿若依 :icon hash"706913071” body" 请通过前端地址访 " body" 认证失败&#xff0c;无法访问系统资源 " 如果页面访问显示不正常&#xff0c;可添加默认访问路径尝试是否显示正常 /login?redi…

Dashboard 介绍

Dashboard 介绍 一、K8S Dashboard简介 简单的说&#xff0c;K8S Dashboard是官方的一个基于WEB的用户界面&#xff0c;专门用来管理K8S集群&#xff0c;并可展示集群的状态。K8S集群安装好后默认没有包含Dashboard&#xff0c;我们需要额外创建它 二、RABC简介 还是那句话&a…

MLP手写数字识别(1)-MNIST数据集下载与可视化(tensorflow)

1.下载与查看MNIST数据集 from keras.datasets import mnist(x_train_image,y_train_label),(x_test_image,y_test_label) mnist.load_data() print("train images:",x_train_image.shape) print("test images:",x_test_image.shape) print("train …

LeetCode 面试经典150题 28.找出字符串中第一个匹配项的下标

题目&#xff1a;给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 思路&#xff1a;暴力&#xff08;…

RabbitMQ知识点总结和复习

之前项目中用到RabbitMQ的场景主要是订单信息的传递&#xff0c;还有就是利用RabbitMQ的死信队列属性设置&#xff0c;实现延迟队列效果&#xff0c;实现超时支付取消功能&#xff0c;以及在两个不同项目中传递数据等场景。 最近几年的工作中都是一直用的RabbitMQ&#xff0c;…