JVM调优几款好用的内存分析工具
对于高并发访问量的电商、物联网、金融、社交等系统来说,JVM内存优化是非常有必要的,可以提高系统的吞吐量和性能。通常调优的首选方式是减少FGC次数或者FGC时间,以避免系统过多地暂停。FGC达到理想值后,比如一天或者两天触发一次FGC。FCT时间优化为100~300毫秒后,再减少YoungGC次数或者YoungGC时间,YoungGC仍然会消耗CPU资源,优化YoungGC调用次数和消耗的CPU资源,可以提高系统的吞吐量。
优化GC前,必须获取GC的实际使用情况,最好的方式是通过CG Log收集垃圾回收日志,通过一些可视化工具查看垃圾回收分析数据,比如GCEasy。持续优化和对比优化前后的GC Log,能确认吞吐量和性能是否得到提升。
下面推荐几个常用的内存分析命令和工具
jstat命令
JDK自带的jstat命令用于查看虚拟机垃圾回收的情况,如下命令使用gcutil参数输出堆内存使用情况统计:
jstat –gcutil -h 20 pid 1000 100
此命令显示进程为pid的内存使用汇总,1000毫秒输出一次,总共输出100行。-h 20表示每20行输出一次表头。-gcutil表示显示JVM内存使用汇总统计:

列表显示了虚拟机各个代的使用情况,描述了堆内存的使用占比和垃圾回收次数,以及占用时间,具体含义如下:
-
S0,第一个幸存区使用比值。
-
S1,第二个幸存区的使用率。
-
E,伊甸园区的使用比值。
-
O,老年代。
-
M,方法区、元空间使用率。
-
CCS,压缩使用比值。
-
YGC,年轻代垃圾回收次数。
-
YGCT,年轻带垃圾回收占用时间。
-
FGC,全局垃圾回收次数,这对性能影响至关重要。
-
FGCT,全局垃圾回收的消耗时间。
-
GCT,总的垃圾回收时间。
可以看到S0、S1、E变化频率高,说明程序在频繁创建生命周期短的对象,FGC为0,表示还未做过全局垃圾回收。如果FGC变化频率很高,则说明系统性能和吞吐量将下降,或者可能出现内存溢出。
其他查看汇总信息的常用选项如下:
-
-gc,类似gcutil,gcutil以百分比形式显示内存的使用情况,gc显示的是内存占用的字节数,以KB的形式输出堆内存的使用情况。
-
-gccause,类似gcutil,额外输出GC的原因。
jmap命令
jmap命令用于保存虚拟机内存镜像到文件中,然后可以使用JVisualVM或者MAT工具进行进一步分析。命令如下:
jmap -dump:format=b,file=filename.hprof pid
需要注意,实际系统会有2GB到8GB内存,此命令会导致虚拟机暂停工作1~3秒。还有一种是被动获取方式,当虚拟机出现内存溢出的时候,会主动“dump”内存文件。添加虚拟机启动参数:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof
当虚拟机判断达到内存溢出触发条件的时候,会有如下输出并保存镜像文件:
java.lang.OutOfMemoryError: Java heap spaceDumping heap to heapdump.hprof ...
当获得镜像文件后,打开JvisualVM工具,选择菜单“File”,点击装入,选择我们保存过的dump文件,这时面板会打开内存镜像文件。打开较大的内存镜像文件需要较长的时间,需要耐心等候,其他工具,如MAT,或者商业的YourKit Java Profiler打开镜像文件更快,分析功能更强大。
GCeasy
GCeasy是一个分析GC日志文件的在线网站,能根据上传的GC日志,以图表形式显示GC回收过程和统计数据。下图显示的是GC性能的统计情况,如吞吐量显示为99.935%,说明只有少量CPU资源用于垃圾回收。最长的GC时间是20毫秒,属于正常范围。在测试JVM参数调整是否能增加吞吐量,减小垃圾回收占用的CPU时,可以使用这个统计功能。

下图统计了GC总的时间和回收的字节数,也显示了Full GC的统计情况。

JMC
Java Mission Control简称JMC,是JDK自带的工具,是一个高性能的对象监视、管理、产生时间分析和诊断的工具套件,笔者主要用来追踪热点代码与热点线程,是主要的内存优化调优工具。
类似JVisualVM,通过JMX连接进入JMC控制台。
通过连接到远程JVM进程后,可以执行飞行记录(FlightRecord),选择飞行记录存放的路径与执行时间即可,如下图所示。需要注意的是,执行飞行记录功能时会对当前JVM进程有一定的性能影响(大约为5%~10%),所以建议JMC连接隔离环境中的服务器并执行飞行记录功能。

通过一段时间的记录,飞行记录可以反映线程的繁忙程度,以及CPU的热点方法。
使用热点方法可以直接找到最耗时的几个方法,对热点方法重点优化就可以使CPU的使用率下降一大截。
飞行记录还可以反映内存增长的热点方法,以及显示单位时间内创建的最多对象的方法。下图为找到的内存对象中创建的最多的char[]的方法,一个是Fastjson,另一个是Kryo。

小结:通过JMC的热点方法的统计结果可以有针对性地进行优化,笔者通过对线上系统进行优化使得CPU使用率下降了40%、内存GC频率下降了100%以上。
MAT
MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器,可以分析具有数亿个对象的内存镜像,快速计算对象大小,自动找到嫌疑的泄漏对象并形成内存泄漏报告。MAT是基于Eclipse开发的,是一款免费的内存镜像分析工具,是笔者发现内存泄漏原因的主要工具。
通过File-Open Heap Dump可以打开内存镜像文件,显示内容如下图所示。

它提供了Leak Suspects 报告,输出有可能发生内存泄漏的对象。
OQL
OQL语句类似SQL语句,可以在VisualVM、MAT等大多数内存镜像分析工具中执行,完成对象查找任务。
相关文章:
JVM调优几款好用的内存分析工具
对于高并发访问量的电商、物联网、金融、社交等系统来说,JVM内存优化是非常有必要的,可以提高系统的吞吐量和性能。通常调优的首选方式是减少FGC次数或者FGC时间,以避免系统过多地暂停。FGC达到理想值后,比如一天或者两天触发一次…...
Vue中路由缓存及activated与deactivated的详解
目录前言一,路由缓存1.1 引子1.2 路由缓存的方法1.2.1 keep-alive1.2.2 keep-alive标签中的include属性1.2.3 include中多组件的配置二,activated与deactivated2.1 引子2.2 介绍activated与deactivated2.3 解决需求三,整体代码总结前言 在Vu…...
【漏洞复现】phpStudy 小皮 Windows面板 RCE漏洞
文章目录前言一、漏洞描述二、漏洞复现前言 本篇文章仅用于漏洞复现研究和学习,切勿从事非法攻击行为,切记! 一、漏洞描述 Phpstudy小皮面板存在RCE漏洞,通过分析和复现方式发现其实本质上是一个存储型XSS漏洞导致的RCE。通过系…...
跨域小样本系列2:常用数据集与任务设定详解
来源:投稿 作者:橡皮 编辑:学姐 带你学习跨域小样本系列1-简介篇 跨域小样本系列2-常用数据集与任务设定详解(本篇) 跨域小样本系列3:元学习方法解决CDFSL以及两篇SOTA论文讲解 跨域小样本系列4…...
HTML浪漫动态表白代码+音乐(附源码)
HTML浪漫表白求爱(附源码),内含4款浪漫的表白源码,可用于520,情人节,生日,求爱场景,下载直接使用。 直接上源码吧 一.红色爱心 1.效果 实际效果是动态的哦 2.源码 复制粘贴即可运行哦 <!DOCTYPE…...
The last packet sent successfully to the server was 0 milliseconds ago. 解决办法
mybatis-generator-maven-plugin插件The last packet sent successfully to the server was 0 milliseconds agoYou must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to…...
分布式高级篇1 —— 全文检索
Elasticsearch Elasticsearch简介一、基本概念1、index(索引)2、Type(类型)3、Document(文档)4、倒排索引二、Docker 安装 EL1、拉取镜像2、创建实例三、初步探索1、_cat2、索引一个文档(保存)3、查询文档3、更新文档4、删除文档&索引5、_bulk 批量 AP6、样本测试数据四、进…...
集成电路开发及应用-模拟数字部分专栏目录
三角波发生器电路图分析_XMJYBY的博客-CSDN博客运算放大器正反馈负反馈判别法_如何理解运算放大器的反馈机制,分哪几种_XMJYBY的博客-CSDN博客运算放大器实现多路同向反向加减运算电路公式推导(一)_反向减法运算电路_XMJYBY的博客-CSDN博客运算放大器实现多路同向反向加减运算电…...
ios使用SARUnArchiveANY 解压rar文件(oc和swift版本)
SARUnArchiveANY简介 开源库网址: https://github.com/saru2020/SARUnArchiveANY 简介: 一个iOS的非常有用的库来解压zip,.rar,7z文件。 他是以下库的简单集成: UnrarKitSSZipArchiveLzmaSDKObjC (7z) 需要注意的是…...
【Python学习笔记】21.Python3 函数(2)
前言 本章介绍调用函数时可使用的正式参数。 参数 以下是调用函数时可使用的正式参数类型: 必需参数关键字参数默认参数不定长参数 必需参数 必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。 调用 printme() 函数,你必须传入一…...
day57回文子串_最长回文子序列
力扣647.回文子串 题目链接:https://leetcode.cn/problems/palindromic-substrings/ 思路 dp数组含义 dp[i][j]:以s[i]为开头,s[j]为结尾的子串是否是回文子串 递推公式 子串范围为[i,j],当s[i]s[j]时,有三种情况࿱…...
Element UI框架学习篇(二)
Element UI框架学习篇(二) 1 整体布局 1.1 前提说明 el-container标签里面的标签默认是从左往右排列,若想要从上往下排列,只需要写el-header或者el-footer就行了 <el-container>:外层容器 <el-header>:顶栏容器。 <el-aside>&#…...
【C++】类与对象(上)
文章目录一、面向过程和面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及封装①访问限定符②封装五、类的作用域六、类的实例化七、类对象模型①如何计算类对象大小②类对象的存储方式③结构体中内存对齐规则八、this指针①this指针的引出②this指针的特性一、面…...
Leetcode.1797 设计一个验证系统
题目链接 Leetcode.1797 设计一个验证系统 Rating : 1534 题目描述 你需要设计一个包含验证码的验证系统。每一次验证中,用户会收到一个新的验证码,这个验证码在 currentTime时刻之后 timeToLive秒过期。如果验证码被更新了,那么它会在 curr…...
Kaldi - 数据文件准备
文章目录数据文件准备wav.scputt2spkspk2utttext相关代码根据文件生成 utt2spk 和 wav.scputt2spk -- spk2utt 转换数据文件准备 在训练/解码中: 有三个文件是必要的: wav.scp 语音编号 – 路径信息utt2spk 语音编号 – 说话人编号spk2utt 说话人编号 …...
91.【SpringBoot-03】
SpringBoot-03(十四)、任务1.异步任务2.邮件任务(1).简单邮箱发送(2).复杂邮箱发送3.定时任务(1).cron表达式(2).特殊表达式(3).定时任务测试(4).常用cron表达式(十五)、Dubbo和Zookeeper集成1.分布式原理(1).Dubbo文档2.什么是RPC?3.Dubbo的概念和介绍(1).Dubbo是什么(2). Du…...
【本地项目】上传到【GitLab】流程详解
文章目录1、安装Git2、创建GitLab项目文件夹3、创建密钥4、向GitLab上传项目注意:本篇文章中提到的上传流程所需要的命令,几乎在GitLab的Command line instructions中都有所记载 1、安装Git 具体安装流程这里不做过多说明,安装流程可以参考…...
初阶指针C
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 目录 🐰指针是什么 🐰指针和指针类型 🌸指针-整数 &#x…...
云原生安全2.X 进化论系列|揭秘云原生安全2.X的五大特征
随着云计算技术的蓬勃发展,传统上云实践中的应用升级缓慢、架构臃肿、无法快速迭代等“痛点”日益明显。能够有效解决这些“痛点”的云原生技术正蓬勃发展,成为赋能业务创新的重要推动力,并已经应用到企业核心业务。然而,云原生技…...
json文件在faster_rcnn中从测试到训练 可行性
1.确认任务 经过mydataset文件处理后 - > 在train_res50_fpn文件内应用 # load train data set # VOCdevkit -> VOC2012 -> ImageSets -> Main -> train.txt train_dataset VOCDataSet(VOC_root, "2012", data_transform["train"], &…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
