JVM实战(19)——JVM调优工具概述

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析

阶段4、深入jdk其余源码解析

阶段5、深入jvm源码解析

一、简介

前面章节,我们已经介绍了如何通过GC日志去分析系统的运行情况。本章,我们将带领大家运行一些JVM调优/检测工具来分析运行中的系统。我们常用的调优/检测工具有三种:jstatjmapjhat,我们来一一看下。

jstat(JVM statistics Monitoring):用于 监视JVM运行时状态信息 的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

jmap(JVM Memory Map):用于生成 heap dump 文件,jmap可以查询当前Java堆内存的详细信息,比如当前各个区域使用率(总容量、已使用、未使用)、当前使用的是哪种收集器等。

jhat(JVM Heap Analysis Tool):,一般与jmap搭配使用,用来 分析jmap生成的dump文件 ,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。

当然,除了上述介绍的最基本的工具外,还有很多图形化的工具,比如VisualVM、MAT等等。我们的目的是介绍使用这些工具进行调优的思路,在理解了思想之后,运用任何工具,都可以轻松把JVM的运行情况分析清楚,一通百通。

二、jstat

jstat可以检查JVM的整体运行情况,包括JVM内的Eden、Survivor、老年代的内存使用情况,以及Young GC和Full GC的频率及耗时。通过这些指标,我们可以分析当前系统的运行状况,判断当前系统的内存使用压力、GC频次是否太高、内存分配是否合理。

2.1 基本用法

jstat的基本用法如下:

jstat [option] LVMID [interval] [count]

  • [option]:操作参数
  • LVMID:JVM进程ID
  • [interval]:连续输出的时间间隔
  • [count]:连续输出的次数

接下来,我们就介绍jstat的一些常用命令。

2.2 jstat -gc PID

jstat -gc PID,该命令可以查看JVM的内存和GC情况,PID就是JVM的进程ID。运行命令后可以看到如下信息:

S0C:From Survivor区的总大小
S1C:To Survivor区的总大小
S0U:From Survivor区目前已使用空间
S1U:To Survivor区目前已使用空间
EC:Eden区的总大小
EU:Eden区目前已使用空间
OC:老年代的总大小
OU:老年代目前已使用空间
MC:方法区(永久代、元数据区)的总大小
MU:方法区(永久代、元数据区)目前已使用空间
YGC:系统运行迄今为止的Young GC次数
YGCT:系统运行迄今为止的Young GC总耗时
FGC:系统运行迄今为止的Full GC次数
FGCT:系统运行迄今为止的Full GC总耗时
GCT:系统运行迄今为止的所有GC总耗时

jstat -gc PID是最常用的命令,基本足够我们分析JVM的运行情况,jstat还有许多其它命令,读者可以参考Oracle官方文档: https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html 。

2.3 分析思路

当我们使用jstat来分析JVM的运行情况时,我们最关注以下信息:

  • 新生代对象的增长速率
  • Young GC的触发频率
  • Young GC的耗时
  • 每次Young GC后的新生代存活对象大小
  • 每次Young GC后的晋升老年代对象大小
  • 老年代对象的增长速率
  • Full GC的触发频率
  • Full GC的耗时

只要知道了这些信息,就可以结合前几章的分析方法对JVM优化:合理分配内存空间,减少新生代对象频繁进入老年代,避免频繁Full GC。

新生代对象的增长速率

根据前面几章的案例分析,我们首先需要对系统的内存使用模型进行估算,也就是分析 每秒钟会在Eden分配多少对象 。

可以通过 jstat -gc PID 1000 10 进行分析,即每隔1s更新一行jstat统计信息,一共执行10次。

举个例子:假如执行这个命令后,第1s先显示出来Eden区使用了200MB内存,第2s显示出来的那行统计信息里,发现Eden区使用了205MB,第3s显示出来的那行,发现Eden区使用了209MB内存。以此类推,可以推断出,系统大概每秒新增5MB左右的对象。

另外,一般系统有高峰和日常两种状态,高峰时期执行上述命令可以看到高峰期的对象增长速率。非高峰期可能系统负载比较低,不一定每秒都有请求,所以可以把上面的1秒钟调整成1分钟,甚至10分钟。

按照上述思路,基本可以对线上系统的高峰和日常两个时段内的对象增长速率有很清晰的了解。

Young GC的触发频率

通过新生代对象的增长速率,可以很容易推测出Young GC的触发频率。比如Eden区总共有800MB内存,高峰期每秒新增5MB对象,那么高峰期大概3分钟就会触发一次Young GC。日常期以次类推。

Young GC耗时

jstat -gc会告诉我们从JVM启动至今一共发生了多少次Young GC以及总耗时。比如系统运行了24小时后共发生了260次Young GC,总耗时20s。那么平均下来,每次Young GC大概就耗时几十毫秒的时间。

Young GC存活/晋升对象大小

每次Young GC过后,有多少对象会存活下来,这个没法直接看出来,但是可以根据Young GC的触发频率推断出来。

比如,我们可以每隔3分钟统计一次(jstsat -g PID 180000 ),此时可以观察,Eden、Survivor、老年代的已使用空间的变化情况。正常来说,Eden区在经历Young GC后会从接近占满到变得很少,Survivor区会放入一些存活对象,老年代可能会增长一些对象占用。

所以,每次Young GC过后的存活对象大小,就是Survivor区的对象大小和本次老年代增长的大小;晋升对象的大小就是本次老年代增长的大小。

Full GC的触发频率/耗时

只要知道了老年代的增长速率,那么Full GC的触发时机就可以推断出来。比如,老年代总共800MB内存,每隔3分钟新增50MB,那么大概1小时触发一次Full GC,这就是Full的触发频率。

至于Full GC的平均耗时,可以通过jstat命令打印出来的JVM启动以来的Full GC次数和总耗时计算出来。比如迄今一共执行了10次Full GC,总耗时30s,那么Full GC平均耗时就是3s左右。

三、jmap

如果只是需要了解JVM的运行情况,然后进行JVM GC优化,那jstat完全够用了。但是有时候,我们会发现JVM新增对象的速度很快,然后就想看看, 到底什么对象占据了那么多的内存 。比如,我们之前的模拟对象晋升一章中,总有几百KB的未知对象占据着空间,jmap就可以帮助我们解决这个问题。

3.1 基本用法

jmap(JVM Memory Map),用于生成 heap dump 文件,可以查询当前Java堆的详细信息,比如当前各个区域使用率(总容量、已使用、未使用)、当前使用的是哪种收集器等。其基本用法如下:

jmap [option] LVMID

*[options]*命令参数:

  • dump:生成堆转储快照
  • finalizerinfo:显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
  • heap:显示Java堆详细信息
  • histo:显示堆中对象的统计信息
  • permstat:打印永久代(元数据区、方法区)中的
  • F:当dump没有响应时,强制生成dump快照

3.2 jmap -heap PID

该命令用于显示Java堆内存的详细信息,比如Eden区总容量、已使用的容量、剩余容量,两个Survivor区的总容量、已使用容量、剩余容量,老年代的总容量、已使用容量、剩余容量。

但是,这些信息一般jstat命令就可以显示,所以一般不会用jmap去看这些信息。

3.3 jmap -histo PID

jmap -histo会打印出类似以下的信息,即当前JVM中的对象占用情况(按空间占用从大到小排序):

所以,通过该命令可以了解到当前内存里到底是哪个对象占用了大量空间

3.4 jmap -dump PID

jmap -dump可以生成一个Java堆转储快照。比如jmap -dump:live,format=b,file=dump.hprof PID,这个命令会在当前目录下生成一个dump.hprof二进制文件,它会把这一时刻Java堆内存中的所有对象的快照放到文件中去,供后续分析。

四、jhat

jhat(JVM Heap Analysis Tool),一般与jmap搭配使用,用来 分析jmap生成的Java堆转储快照文件 。

jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。

一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。另外,分析同样一个dump快照, MAT 需要的额外内存比jhat要小的多的多,所以建议使用MAT来进行分析,当然也看个人偏好。

4.1 基本用法

jstat的基本用法如下:

jhat [dumpfile]

比如,可以使用命令jhat dump.hprof -port 7000启动jhat服务器,当通过浏览器访问7000端口时,就可以通过图形化的方式去分析堆内存里的对象分布情况了。

五、总结

本章,我们介绍了jstatjmapjhat这三种命令行工具的基本用法。系统开发完毕后,一般要经过 预估性优化 、 压测优化 、 线上监控 这三个过程。

预估性优化 :本质就是 估算系统内存使用模型,然后合理分配Java堆内存,尽量让每次Young GC后的存活对象小于Survivor区,避免存活对象频繁进入老年代引发Full GC 。

压测优化 :是对预估性优化的检验,通常这个环境会使用一些压测工具模拟高并发的访问,看看系统能否撑住请求压力、响应延时是否在正常范围内,保持稳定运行。压测环节需要借助jstat等工具分析JVM运行情况,然后合理调整堆内存分布。

线上监控 :是系统上线之后对JVM的监控,最简单的方式是在每天的高峰期和日常期,用jstatjmapjhat等命令查看JVM情况。更常见的做法是引入专门的监控系统,比如Zabbix、OpenFalcon、Ganglia等。业务系统会将JVM统计项发给这些监控系统,然后监控系统会进行分析并以图形化方式动态展现,还可以制定监控规则,让其对频繁GC的情况进行告警。

下一章,我们将通过实际案例讲解如何通过jstatjmapjhat这三种命令行工具进行优化。

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

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

相关文章

代码随想录 Leetcode541. 反转字符串 II

题目&#xff1a; 代码(首刷自解 2024年1月16日&#xff09;&#xff1a; class Solution { public:void reverse(string& s,int left,int right) {char temp;while (left < right) {temp s[left];s[left] s[right];s[right] temp;left;--right;}return;}string rev…

FastDFS 环境搭建及使用详解

文章目录 1、简介1.1 分布式文件系统1.2 FastDFS1.3 FastDFS架构 2、环境搭建2.1 FastDFS安装2.1.1 安装前准备2.1.2 安装包下载2.1.3 安装 libfastcommon2.1.4 安装 libserverframe2.1.5 安装 FastDFS 2.2 FastDFS配置2.2.1 配置tracker2.2.1.1 创建 tracker 工作目录2.2.1.2 …

Android APP开发集成微信登陆流程(手把手新手版)

本文比较适合新手玩家&#xff0c;老玩家就不要看了 昨天整了下微信登陆&#xff0c;乍一看官方文档还有点难懂&#xff01;遂自己整理了下流程&#xff0c;给大家参考参考。 官方文档链接&#xff1a;准备工作 | 微信开放文档微信开发者平台文档https://developers.weixin.q…

晶圆表面缺陷检测现状概述

背景&#xff1a; 晶圆表面缺陷检测设备主要检测晶圆外观呈现出来的缺陷&#xff0c;损伤、毛刺等缺陷&#xff0c;主要设备供应商KLA&#xff0c;AMAT&#xff0c;日立等&#xff0c;其中KLA在晶圆表面检测设备占有市场52%左右。 检测设备分类&#xff1a; 电子束设备和光学…

浅谈安科瑞电流表和频率表在冰岛某木制品工厂的的应用

摘要&#xff1a;用户侧配电系统的智能化、精细化、可视化是当下配电管理的必然趋势。针对用户侧的配电进线回路&#xff0c;设计安装智能仪表&#xff0c;再通过设置仪表参数来实时监控各负载回路的工作状态&#xff1b;提高用能安全、提升设备维护效率、降低维护的人工成本、…

分类预测 | Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测

分类预测 | Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测 目录 分类预测 | Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现CS-SVM布谷鸟算法优化支持向量机的数据分类预测。 2.自带数据…

Matlab 使用 DH table 建立的 robot 和实际不符

机器人仿真 想借助 matlab robotics toolbox 来仿真机器人&#xff0c;但是直接输入自己的 DH table 显示出来的 robot 和实际不情况不符。 DH table 建立 robot Build Manipulator Robot Using Kinematic DH Parameters 主要使用 setFixedTransform&#xff0c;DH table 中…

【松叶漫话】来聊聊ChatGPT 和文心一言吧

两大AI助手的较量 在当今信息技术飞速发展的时代&#xff0c;人工智能助手成为我们生活中不可或缺的一部分。ChatGPT和文心一言作为两大代表性的AI助手&#xff0c;在智能回复、语言准确性、知识库丰富度等方面各有千秋。本文将就这两位AI助手的特点进行深入比较&#xff0c;为…

OLAP引擎也能实现高性能向量检索,据说QPS高于milvus!

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 随着 LLM 技术应用及落地&#xff0c;数据库需要提高向量分析以及 AI 支持能力&#xff0c;向量数据库及向量检索等能力“异军突起”&#xff0c;迎来业界持续不断关…

深入解析阻塞队列BlockingQueue及源码(超详细)

一、基础概念 1.1 BlockingQueue BlockingQueue 是 java.util.concurrent 包提供的用于解决并发生产者 - 消费者问题的最有用的类。 1.1.1 队列类型&#xff1a; 无限队列 &#xff08;unbounded queue &#xff09; - 几乎可以无限增长 有限队列 &#xff08; bounded qu…

自创C++题目——风扇

预估难度 简单 题目描述 有一个风扇&#xff0c;它有个旋转叶片&#xff0c;每个旋转叶片的编号是&#xff0c;请输出它旋转后&#xff0c;中心点与地面的直线距离哪个叶片最近&#xff0c;输出此旋转叶片的编号。默认以“”的形式。 当时&#xff1a; 当或时&#xff0c;…

海康visionmaster-VM 嵌入:嵌入用户软件界面的方法

描述 环境&#xff1a;VM4.0.0 VS2015 及以上 现象&#xff1a;将 VM 整体嵌入到客户软件界面中&#xff1f; 解答 将 VM 软件整体嵌入到客户软件中&#xff0c;需要利用 Panel 控件&#xff0c;并且需要先启动 VM 软件&#xff0c;具 体代码如下&#xff1a; C# [DllImport(“…

linux NTP服务器配置

需求场景&#xff1a;局域网内多台服务器时间同步&#xff0c;保持一致 前提条件&#xff1a; 1&#xff0c;各服务器已正确安装NTP服务&#xff0c;查询命令如下&#xff1a; rpm -qa | grep ntp&#xff0c;若回显信息中包含ntp-4.2之类的&#xff0c;表示服务器上存在ntp…

电脑监控软件有哪些,那个好用?

在当今信息化时代&#xff0c;电脑已经成为企业和个人工作、生活中不可或缺的工具。 然而&#xff0c;随着网络的普及和电脑使用频率的增加&#xff0c;也带来了一些安全隐患和管理上的挑战。 为了更好地保护电脑安全、规范员工工作纪律&#xff0c;越来越多的企业和个人开始使…

day18 找树左下角的值 路径总和 路径总和Ⅱ 从中序与后序遍历序列构造二叉树 从前序与中序遍历序列构造二叉树

题目1&#xff1a;513 找树左下角的值 题目链接&#xff1a;513 找树左下角的值 题意 找出二叉树的最底层 最左边节点的值 (假设二叉树中至少有1个节点) 最底层节点确保是深度最大的叶子节点&#xff0c;最左边的节点却不一定是左孩子 递归遍历 深度最大的叶子节点最…

docker使用nginx部署vue刷新页面404

docker使用nginx部署vue刷新页面404 从docker内部复制出来的配置文件是这样的&#xff0c;但是刷新页面之后就显示404&#xff0c;关键是我两个前端项目都是用的这一个配置文件&#xff0c;但是只有一个项目出现刷新浏览器显示404的问题&#xff0c;这给我搞懵了&#xff01;&…

【dayjs】类型“Dayjs”上不存在属性“isSameOrAfter”

dayjs中有一些方法是需要使用插件后才能使用&#xff0c;默认情况下&#xff0c;Day.js只提供核心代码&#xff0c;没有安装插件。 解决方法&#xff1a; import dayjs from dayjs;import isSameOrAfter from dayjs/plugin/isSameOrAfter;dayjs.extend(isSameOrAfter);再次使…

AI嵌入式K210项目(5)-串口通讯

文章目录 前言一、什么是UART&#xff1f;二、K210的UART三、实验过程总结 前言 串口通讯是平时大家进行调试最常用的方法&#xff0c;嵌入式应用通常要求一个简单的并且占用系统资源少的方法来传输数据。通用异步收发传输器 (UART)即可以满足这些要求&#xff0c;它能够灵活地…

odoo16 权限继承修改字段显示2

odoo16 权限继承修改字段显示2 上次文章写道:最近在搭建的一个服装批发中心使用的进销存一体化项目,由于客户文化水平低,不想在发货界面显示 好多无用功能,有些是有用的,有些是他不关心的。占在用户角度考虑,用不到的功能都是垃圾。有他们的道理。在隐藏的过程中,出现了…

2011 年考研数二真题解析

一、选择题 【01】【02】【03】【04】【05】【06】【07】【08】 二、填空题 【09】【10】【11】【12】【13】【14】 三、解答题 【15】【16】【17】【18】【19】【20】【21】【22】【23】