使用JDK自带工具进行JVM内存分析之旅

在这里插入图片描述

进行jvm内存分析可以排查存在和潜在的问题。

通过借助jdk自带的常用工具,可以分析大概可能的问题定位以及确定优化方向。

JVM内存分析有很多好处。

  • 内存泄漏排查:JVM 内存泄漏是指应用程序中的对象占用的内存无法被垃圾回收器释放,导致内存占用持续增长,最终耗尽可用内存。通过内存分析工具,可以检测到哪些对象占用了大量内存且无法被释放,进而定位到可能存在内存泄漏的代码。
  • 内存优化:合理优化 JVM 内存配置可以提高应用程序的性能和稳定性。通过分析应用程序的内存使用情况,可以调整堆内存大小、永久代(如果是旧版 Java)大小、新生代与老年代比例等参数,以减少垃圾回收频率,降低内存占用。
  • 性能调优:内存分析也有助于发现内存中的瓶颈,如频繁的 Full GC(全局垃圾回收)导致的停顿时间过长。通过调整垃圾回收器类型、GC 算法、堆内存大小等参数,可以改善应用程序的性能表现。
  • 异常分析:当应用程序出现内存相关的异常,如 OutOfMemoryError(内存溢出错误)时,通过分析内存使用情况可以找到导致异常的根本原因,例如某个模块或对象占用了过多内存。
  • 容量规划:对于大型应用程序或者需要长时间运行的系统,进行内存分析可以帮助进行容量规划,确保系统具有足够的内存资源支持应用程序的正常运行。

本文将通过一次jvm内存分析过程来说明jpsjcmdjstatjstackjmap 工具的使用方法。

本文使用到的是JDK17版本。

一次jvm内存分析之旅

当需要进行 JVM 内存分析时,结合使用 jpsjcmdjstatjstackjmap 可以提供全面的诊断信息。

下面是一般的步骤:

使用 jps 查看 Java 进程的 PID

jps -l

这将列出所有 Java 进程的 PID 和主类名。

使用 jcmd 执行一些诊断命令

jcmd <PID> VM.flags
jcmd <PID> VM.system_properties

这些命令可以显示 JVM 的启动参数和系统属性,帮助了解 JVM 的配置。

使用 jstat 监视 JVM 内存和垃圾回收情况

jstat -gc <PID> 5000 10

这将持续输出 JVM 的垃圾回收情况,包括各个堆区的使用情况、GC 时间等。

使用 jstack 生成线程堆栈信息

jstack <PID>

查看线程堆栈信息,以检查是否存在死锁或其他线程相关的问题。

使用 jmap 生成堆转储文件

jmap -dump:file=heapdump.hprof <PID>

这将生成一个名为 heapdump.hprof 的堆转储文件,可以用于进一步分析内存使用情况,查找内存泄漏等问题。

分析堆转储文件

使用工具如 Eclipse Memory Analyzer (MAT) 或者 VisualVM 来分析生成的堆转储文件,查找内存泄漏、大对象、无用对象等问题。

通过结合使用这些工具,可以全面地了解 JVM 运行时的状态,诊断性能问题,以及解决内存相关的错误。

下面将详细解释这些工具的使用方法。

jps

jps 是 JDK 提供的一个用于列出 Java 虚拟机进程的命令行工具。它通常用于查看当前系统中正在运行的 Java 进程的 PID(进程标识符)以及对应的主类名。

下面是 jps 命令的使用方法:

或者使用ps -ef|grep java 也可以搜索到对应的pid。

jps [ options ] [ hostid ]

其中,options 是一些可选的参数,hostid 是可选的主机标识符。常用的选项包括:

  • -q:仅显示进程的 PID,不显示对应的主类名。
  • -m:显示传递给主类的参数。
  • -l:显示主类的全限定名,通常用于区分具体的 Java 应用程序。
  • -v:显示传递给 JVM 的参数。

例如,要显示当前系统中所有 Java 进程的 PID 和对应的主类名,可以直接运行 jps 命令:

jps

如果要仅显示 PID,可以使用 -q 选项:

jps -q

要显示主类的全限定名,可以使用 -l 选项:

jps -l

如果要显示传递给主类的参数,可以使用 -m 选项:

jps -m

如果要显示传递给 JVM 的参数,可以使用 -v 选项:

jps -v

jcmd

jcmd:jcmd 命令是 Java 8 新增的命令,可以执行多种 JVM 监控和诊断任务。例如,可以使用 jcmd <pid> VM.flags 查看 JVM 启动参数,或者使用 jcmd <pid> Thread.print 打印线程堆栈信息。

下面是 jcmd 命令的基本使用方法:

jcmd <PID | main class> <command> [options]

其中:

  • <PID | main class>:要操作的 Java 进程的 PID(进程标识符)或者主类名。如果提供了 PID,则直接操作对应的 Java 进程;如果提供了主类名,则 jcmd 会尝试找到匹配的 Java 进程并执行相应的命令。
  • <command>:要执行的诊断命令。
  • [options]:可选的命令参数。

常用的 jcmd 命令包括:

  • help: 显示 jcmd 支持的命令列表,以及每个命令的简要描述。
  • VM.version: 显示 JVM 的版本信息。
  • VM.flags: 显示 JVM 的启动参数。
  • VM.system_properties: 显示 JVM 的系统属性。
  • Thread.print: 打印 Java 进程中所有线程的堆栈信息。
  • GC.run: 执行一次垃圾回收。
  • GC.heap_dump: 生成 Java 堆转储文件(heap dump)。

举例来说,如果要打印指定 Java 进程的线程堆栈信息,可以使用以下命令:

jcmd <PID> Thread.print

如果要执行一次垃圾回收,可以使用以下命令:

jcmd <PID> GC.run

如果要生成 Java 堆转储文件,可以使用以下命令:

jcmd <PID> GC.heap_dump <filename>

jstat

jstat:jstat 命令可以监视 JVM 内存、垃圾回收等情况。例如,可以使用 jstat -gc <pid> 查看垃圾回收统计信息,或者使用 jstat -gcutil <pid> 查看垃圾回收统计信息及内存使用情况。

下面是 jstat 的基本使用方法:

jstat [ options ] <PID> [ interval [ count ] ]

其中:

  • [ options ]:可选的命令选项,用于指定要监视的数据类型和格式。
  • <PID>:要监视的 Java 进程的 PID(进程标识符)。
  • [ interval ]:可选参数,指定输出统计信息的时间间隔(以毫秒为单位)。如果省略,则默认为每秒一次。
  • [ count ]:可选参数,指定输出统计信息的次数。如果省略,则默认为无限次输出。

常用的 jstat 命令选项包括:

  • -class: 显示类加载、卸载信息以及类加载器的状态。
  • -gc: 显示垃圾回收相关的信息,包括各个代的使用情况、GC 时间等。
  • -compiler: 显示即时编译器(JIT)的编译统计信息。
  • -gccapacity: 显示各个堆区的容量及使用情况。
  • -gcutil: 显示各个堆区的使用情况,以百分比表示。
  • -gccause: 显示导致最近一次 GC 的原因。
  • -printcompilation: 打印方法的即时编译(JIT)信息。

举例来说,要查看 Java 进程的类加载情况,可以使用以下命令:

jstat -class <PID>

如果想要每隔 5 秒输出一次类加载信息,共输出 10 次,可以使用以下命令:

jstat -class <PID> 5000 10

jstat只能查看当前的gc信息,查看gc日志更适合线上环境的做法是在启动JVM时加上-XX:+PrintGCDetails -Xloggc:/path/to/gc.log(JDK1.8以下)或者-Xlog:gc*:file=/path/to/gc.log(JDK9+)参数,将生成的gc日志文件放到GCViewer、GCeasy(需注册)进行分析。

jstack

jstack:jstack 命令用于生成 Java 线程转储快照,可以用于分析线程状态、死锁等问题。例如,可以使用 jstack <pid> 打印线程堆栈信息,或者使用 jstack -l <pid> 打印线程堆栈信息及锁信息。

下面是 jstack 命令的基本使用方法:

jstack [ options ] <PID>

其中:

  • [ options ]:可选的命令选项,用于指定输出的格式等。
  • <PID>:要生成线程堆栈信息的 Java 进程的 PID(进程标识符)。

常用的 jstack 命令选项包括:

  • -l: 长列表格式,显示关于锁的附加信息,如拥有者和等待队列。
  • -F: 当正常输出的 jstack 命令不起作用时,强制生成线程堆栈信息。这在 Java 进程没有响应时可能会很有用,但可能会导致进程暂停一段时间。
  • -m: 显示 Java 和本地方法的堆栈跟踪,而不仅仅是 Java 堆栈跟踪。
  • -h: 显示帮助信息。

举例来说,要生成指定 Java 进程的线程堆栈信息,可以使用以下命令:

jstack <PID>

如果想要输出长列表格式的线程堆栈信息,可以使用 -l 选项:

jstack -l <PID>

如果 Java 进程没有响应,可以使用 -F 选项强制生成线程堆栈信息:

jstack -F <PID>

jmap

异常没有发生定位异常代码,需要通过jmap生成dump文件。

然后将其导入到 MAT 中进行分析。以下是生成堆转储文件的步骤:

  • 确定 Java 进程 ID:首先,需要确定正在运行的 Java 进程的进程 ID(PID)。可以使用 jps 命令查看正在运行的 Java 进程及其 PID。
  • 生成堆转储文件:使用 jmap 命令生成堆转储文件。命令格式如下:
jmap -dump:file=<文件路径> <PID>

例如,要生成名为 heapdump.hprof 的堆转储文件,可以执行以下命令:

jmap -dump:file=heapdump.hprof <PID>

这将在当前工作目录下生成一个名为 heapdump.hprof 的堆转储文件。

  • 导入堆转储文件到 MAT:将生成的堆转储文件导入到 MAT 中进行分析。打开 MAT,然后选择 File -> Open Heap Dump,然后选择生成的堆转储文件。
  • 执行内存分析:一旦堆转储文件被导入到 MAT 中,就可以执行内存分析,按照前面提到的步骤来查找内存问题。

通过这些步骤可以手动生成堆转储文件并使用 MAT 进行分析,即使没有在 OutOfMemoryError 发生时自动生成堆转储文件也可以找到问题所在。

更适合线上环境的做法是在启动JVM时加上-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump.hprof参数,这样当发生OutOfMemoryError时,JVM会自动生成堆转储文件。

关于作者

来自一线全栈程序员nine的探索与实践,持续迭代中。

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

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

相关文章

遥瞻智慧:排水系统远程监控的卓越解决方案

遥瞻智慧&#xff1a;排水系统远程监控的卓越解决方案 在城市脉络的深层肌理中&#xff0c;排水系统犹如一条条隐秘的生命线&#xff0c;默默承载着城市的呼吸与律动。然而&#xff0c;如何以科技之眼&#xff0c;赋予这些无形网络以实时感知、精准调控的能力&#xff0c;使之…

基于机器学习的车辆状态异常检测

基于马氏距离的车辆状态异常检测&#xff08;单一传感器&#xff09; 基于多元自动编码器的车辆状态异常检测 基于单传感器平滑马氏距离的车辆状态异常检测 工学博士&#xff0c;担任《Mechanical System and Signal Processing》等期刊审稿专家&#xff0c;擅长领域&#xff1…

数据分析场景,连号相关业务

连号相关业务 业务场景&#xff1a;现在需要从a列一堆编号中&#xff0c;将连号范围在10以内的数据分别分成一组。 先看实先效果 演示的为db2数据库&#xff0c;需要含有窗口函数&#xff0c;或者可以获取到当前数据偏移的上一位数据 第一步&#xff1a;将A列数据正序第二步…

量子密钥分发系统的设计与实现(三):量子信号的产生、调制及探测技术讨论

之前的文章我们对量子密钥分发系统功能的光路子系统进行了较为全面的分析&#xff0c;我们理解了光路子系统是量子密钥分发系统的基础。本文我们主要探讨下量子信号产生、调制及探测的基础技术&#xff0c;算是一篇承上启下的文章吧&#xff0c;对相关的原理进行探讨&#xff0…

如何使用 ArcGIS Pro 制作边界晕渲效果

在某些出版的地图中&#xff0c;边界有类似于“发光”的晕渲效果&#xff0c;这里为大家介绍一下如何使用ArcGIS Pro 制作这种晕渲效果&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的行政区划数据&#xff0c;除了行政区划数据&#xff0c…

wsl2 Ubuntu子系统内存只有一半的解决办法

物理机的内存是64G&#xff0c;在wsl2安装完Ubuntu20.04后&#xff0c;输入命令&#xff1a; free -g 发现只有32G&#xff0c;原因是默认只能获得物理机一半的内存&#xff1a; WSL 中的高级设置配置 | Microsoft Learn 因此可手动修改为与物理机同等大小&#xff1a; 1&a…

如何解决DDoS攻击?群联科技做出回答。

DDoS攻击&#xff08;分布式拒绝服务攻击&#xff09;是一种恶意利用多台傀儡机协同发起大规模网络流量&#xff0c;旨在压垮目标系统或网络资源&#xff0c;使其无法正常服务的网络攻击手段。由于现代计算机和网络性能的提升&#xff0c;单点发起的DoS攻击已难以奏效&#xff…

Day01——NestJS学习之了解、安装、运行

什么是 Nest.js&#xff1f; NestJs 官方简介: Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用 JavaScript 的渐进增强的能力&#xff0c;使用并完全支持 TypeScript &#xff08;仍然允许开发者使用纯 JavaScript 进行开发&#x…

数据仓库作业五:第8章 关联规则挖掘

目录 第8章 关联规则挖掘作业题 第8章 关联规则挖掘 作业题 1、设4-项集 X { a , b , c , d } X\{a,b,c,d\} X{a,b,c,d}&#xff0c;试求出由 X X X 导出的所有关联规则。 解&#xff1a; 首先生成项集的所有非空真子集。这包括&#xff1a; { a } , { b } , { c } , {…

ansible执行mysql脚本

目录 概述实践环境要求ansible yml脚本命令离线包 概述 ansible执行mysql脚本 实践 官网文档 环境要求 环境需要安装以下内容: 1.mysql客户端(安装了mysql即会有)2.安装MySQL-python (Python 2.X) 详细插件安装链接 ansible yml脚本 关键代码如下&#xff1a; # 剧本…

ROS2学习笔记(一) 基本概念

1. Node 节点 节点: 完成具体功能的模块 相关命令 #运行命令 ros2 run <package_name> <executable_name>#当前节点查询查询 ros2 node list#重映射 Remapping ros2 run <package_name> <executable_name> --ros-args --remap __node:<node_na…

KaiwuDB CTO 魏可伟:AIoT,用行业定义数据库

4月12日&#xff0c;由中国 DBA 联盟&#xff08;ACDU&#xff09;与墨天轮社区联合主办的第十三届数据技术嘉年华&#xff08;DTC 2024&#xff09;于北京盛大召开。KaiwuDB CTO 魏可伟受邀发表《智创当下&#xff0c;KaiwuDB 从多模到 AI 的探索实践》主题演讲&#xff0c;向…

Axure如何实现限制选择项数量的交互

大家经常会看到这样的功能设计&#xff1a;可以多选&#xff0c;但是限制多选。比如某招聘网站城市的选择只能选择5个。再选择第6个的时候会提示最多只能选择5项。 这个效果是我们经常会遇到的&#xff0c;在工作中也经常会遇到需要制作这样的效果。今天我们一起来看看&#xf…

Mac M3 安装Ollama和llama3,本地部署LobeChat和刘皇叔聊三国!

OllamaLobeChat&#xff0c;本地部署聊天助手 Ollama安装下载OllamaOllama常用指令和链接运行OllamaAPI 交互Ollama基于Llama 3角色扮演 LobeChat安装首先安装docker安装LobeChat的docker 镜像和运行 Ollama安装 下载Ollama 网址&#xff1a;https://ollama.com/ 支持macOS、…

产废端实时音视频监控系统在运输车辆驾驶室中的应用

实时音视频监控系统可通过在运输车辆驾驶室安装音视频摄录设备&#xff0c;实现将运输车辆内部及周围环境音视频数据通过移动网络实时回传指挥中心的功能。 前端摄录设备主要负责采集车内外的视音频信息&#xff0c;为了保障车辆及运输人员 的安全&#xff0c;应合理选择摄录设…

LeetCode 349.两个数组的交集(HashSet的使用)

给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2]示例 2&#xff1a; 输入&#xff1a;nums1 …

电商技术揭秘三十:知识产权保护浅析

电商技术揭秘相关系列文章&#xff08;上&#xff09; 相关系列文章&#xff08;中&#xff09; 电商技术揭秘二十&#xff1a;能化供应链管理 电商技术揭秘二十一:智能仓储与物流优化(上) 电商技术揭秘二十二:智能仓储与物流优化(下) 电商技术揭秘二十三&#xff1a;智能…

学习大数据的第一天

今天学习如何安装hapood安装 1.安装hapood安装 2.需要的资料 3.开始安装 1.创建目录 mkdir -p /export/server 2.进入目录下 cd /export/server/ 3.安装 安装需要的依赖 yum install gcc gcc-c make autoconf automake libtool curl lzo-devel zlib-devel openssl opens…

安装SSL证书之后还会有不安全提示怎么办?

安装SSL证书过程中如果遇到错误&#xff0c;不要慌&#xff0c;按照以下步骤进行排查和解决&#xff1a; 1. 仔细阅读错误信息&#xff1a; - 错误消息通常会明确指出问题所在&#xff0c;如证书过期、证书链不完整、域名不匹配等。记下或截图保存具体的错误代码和描述&#xf…

解锁ApplicationContext vs BeanFactory: 谁更具选择性?

目录 一、聚焦源码回顾 &#xff08;一&#xff09;源码分析和理解 &#xff08;二&#xff09;简短的回顾对比建议 二、ApplicationContext vs BeanFactory特性对比 &#xff08;一&#xff09;主要特性总结 &#xff08;二&#xff09;直接建议 三、案例简单说明 &am…