Java问题诊断和排查工具(查看JVM参数、内存使用情况及分析等)

2023-10-30

JDK自带的工具

在JDK的bin目录下有很多命令行工具:

  我们可以看到各个工具的大小基本上都稳定在27kb左右,这个不是JDK开发团队刻意为之的,而是因为这些工具大多数是jdk\lib\tools.jar类库的一层薄包装而已,他们的主要功能代码是在tools类库中实现的。命令行工具的好处是:当应用程序部署到生产环境后,无论是直接接触物理服务器还是远程telnet到服务器上都会受到限制。而借助tools.jar类库里面的接口,我们可以直接在应用程序中实现功能强大的监控分析功能。

常用命令:

这里主要介绍如下几个工具:

1、jps:查看本机java进程信息

2、jstack:打印线程的信息,制作 线程dump文件

3、jmap:打印内存映射信息,制作 堆dump文件

4、jstat:性能监控工具

5、jhat:内存分析工具,用于解析堆dump文件并以适合人阅读的方式展示出来

6、jconsole:简易的JVM可视化工具

7、jvisualvm:功能更强大的JVM可视化工具

8、javap:查看字节码

JAVA Dump:

JAVA Dump就是虚拟机运行时的快照,将虚拟机运行时的状态和信息保存到文件中,包括:

线程dump:包含所有线程的运行状态,纯文本格式

堆dump:包含所有堆对象的状态,二进制格式

1、jps

显示当前所有java进程pid的命令,我们可以通过这个命令来查看到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),不过jps有个缺点是只能显示当前用户的进程id,要显示其他用户的还只能用linux的ps命令。

执行jps命令,会列出所有正在运行的java进程,其中jps命令也是一个java程序。前面的数字就是进程的id,这个id的作用非常大,后面会有相关介绍。

jps -help:

jps -l 输出应用程序main.class的完整package名或者应用程序jar文件完整路径名

jps -v 输出传递给JVM的参数

jps失效

我们在定位问题过程会遇到这样一种情况,用jps查看不到进程id,用ps -ef | grep java却能看到启动的java进程。

要解释这种现象,先来了解下jps的实现机制:

java程序启动后,会在目录/tmp/hsperfdata_{userName}/下生成几个文件,文件名就是java进程的pid,因此jps列出进程id就是把这个目录下的文件名列一下而已,至于系统参数,则是读取文件中的内容。

我们来思考下:如果由于磁盘满了,无法创建这些文件,或者用户对这些文件没有读的权限。又或者因为某种原因这些文件或者目录被清除,出现以上这些情况,就会导致jps命令失效。

如果jps命令失效,而我们又要获取pid,还可以使用以下两种方法:

1、top | grep java

2、ps -ef |grep java

2、jstack

主要用于生成指定进程当前时刻的线程快照,线程快照是当前java虚拟机每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致长时间等待。

3、jmap

主要用于打印指定java进程的共享对象内存映射或堆内存细节。

堆Dump是反映堆使用情况的内存镜像,其中主要包括系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等。一般在内存不足,GC异常等情况下,我们会去怀疑内存泄漏,这个时候就会去打印堆Dump。

jmap的用法摘要:

1、jmap pid

打印的信息分别为:共享对象的起始地址、映射大小、共享对象路径的全程。

2、jmap -heap pid:查看堆使用情况

3、jmap -histo pid:查看堆中对象数量和大小

打印的信息分别是:序列号、对象的数量、这些对象的内存占用大小、这些对象所属的类的全限定名

如果是内部类,类名的开头会加上*,如果加上live子参数的话,如jmap -histo:live pid,这个命名会触发一次FUll GC,只统计存活对象

4、jmap -dump:format=b,file=heapdump pid:将内存使用的详细情况输出到文件

然后使用jhat命令查看该文件:jhat -port 4000 文件名 ,在浏览器中访问http:localhost:4000/

总结:

该命令适用的场景是程序内存不足或者GC频繁,这时候很可能是内存泄漏。通过用以上命令查看堆使用情况、大量对象被持续引用等情况。

4、jstat

主要是对java应用程序的资源和性能进行实时的命令行监控,包括了对heap size和垃圾回收状况的监控。

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

option:我们经常使用的选项有gc、gcutil

vmid:java进程id

interval:间隔时间,单位为毫秒

count:打印次数

1、jstat -gc PID 5000 20

S0C:年轻代第一个survivor的容量(字节)

S1C:年轻代第二个survivor的容量(字节)

S0U:年轻代第一个survivor已使用的容量(字节)

S1U:年轻代第二个survivor已使用的容量(字节)

EC:年轻代中Eden的空间(字节)

EU:年代代中Eden已使用的空间(字节)

OC:老年代的容量(字节)

OU:老年代中已使用的空间(字节)

PC:永久代的容量

PU:永久代已使用的容量

YGC:从应用程序启动到采样时年轻代中GC的次数

YGCT:从应用程序启动到采样时年轻代中GC所使用的时间(单位:S)

FGC:从应用程序启动到采样时老年代中GC(FULL GC)的次数

FGCT:从应用程序启动到采样时老年代中GC所使用的时间(单位:S)

2、jstat -gcutil PID 5000 20

s0:年轻代中第一个survivor已使用的占当前容量百分比

s1:年轻代中第二个survivor已使用的占当前容量百分比

E:年轻代中Eden已使用的占当前容量百分比

O:老年代中已使用的占当前容量百分比

P:永久代中已使用的占当前容量百分比

5、jhat

主要用来解析java堆dump并启动一个web服务器,然后就可以在浏览器中查看堆的dump文件了。

生成dump文件的方法前面已经介绍了,这边主要介绍如何解析java堆转储文件,并启动一个web server

jhat heapdump

这个命令将heapdump文件转换成html格式,并且启动一个http服务,默认端口为7000。

如果端口冲突,可以使用以下命令指定端口:jhat -port 4000 heapdump

下面我们来访问下:ip:port

6、jinfo

jinfo可以用来查看正在运行的java运用程序的扩展参数,甚至支持在运行时动态地更改部分参数。

基本使用语法如下: jinfo -< option > < pid > ,其中option可以为以下信息:

-flag< name >: 打印指定java虚拟机的参数值

-flag [+|-]< name >:设置或取消指定java虚拟机参数的布尔值

-flag < name >=< value >:设置指定java虚拟机的参数的值

使用示例

下面的命令显示了新生代对象晋升到老年代对象的最大年龄。在运行程序运行时并没有指定这个参数,但是通过jinfo,可以查看这个参数的当前的值。

下面的命令显示是否打印gc详细信息:

下面的命令在运用程序运行时动态打开打印详细gc信息开关:

注意事项:jinfo虽然可以在java程序运行时动态地修改虚拟机参数,但并不是所有的参数都支持动态修改。

7、jcmd

在JDK 1.7之后,新增了一个命令行工具jcmd。它是一个多功能工具,可以用来导出堆,查看java进程,导出线程信息,执行GC等。jcmd拥有jmap的大部分功能,Oracle官方建议使用jcmd代替jmap。

使用 jcmd -l 命令列出当前运行的所有虚拟机,示例:

针对每一个虚拟机,可以使用help命令列出该虚拟机支持的所有命令,示例:

子命令含义:

  • VM.native_memory

  • VM.commercial_features

  • GC.rotate_log

  • ManagementAgent.stop

  • ManagementAgent.start_local

  • ManagementAgent.start

  • Thread.print, 打印线程栈信息

  • GC.class_histogram, 查看系统中类统计信息

  • GC.heap_dump, 导出堆信息,与jmap -dump功能一样

  • GC.run_finalization, 触发finalize()

  • GC.run, 触发gc()

  • VM.uptime, VM启动时间

  • VM.flags, 获取JVM启动参数

  • VM.system_properties, 获取系统Properties

  • VM.command_line, 启动时命令行指定的参数

  • VM.version

  • help

示例:

8、可视化监控工具(JConsole、JVisualVM)

集上面之大成,并提供了可视化的界面;还可以监控远程Java服务;支持监控JMX。

JVisualVM比JConsole更强大:支持对CPU、内存运行进行采样、配置。推荐用JVisualVM。

JConsole监控页面示例:

JVisualVM监控页面示例:

参考资料

http://www.cnblogs.com/dongguacai/p/5910134.html

http://qifuguang.me/categories/%E5%B7%A5%E5%85%B7%E4%BD%BF%E7%94%A8/

其他工具

JOL(即Java Object Layout):OpenJDK提供的库,用于查看Java对象的内存布局,这个很有用,可以借助它来跟踪锁升级等过程。只需要引入Maven即可使用,示例:

View Code

openJDK源码:查看 JDK native 方法的实现

strace:跟踪程序运行过程发起的系统调用

https://fastthread.io:线程栈分析的网站

详情参阅文章 看见Java-公众号低并发编程

线上问题排查思路(八股)

硬盘使用情况:du 命令

内存使用且情况:free 命令

CPU使用情况:top 命令

网络使用情况:netstat 命令

Java程序问题分析:jmap 分析堆内存、jstack 分析线程栈等,见前文。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java问题诊断和排查工具(查看JVM参数、内存使用情况及分析等) 的相关文章

  • Java中ArrayList的交集和并集

    有什么方法可以做到这一点吗 我正在寻找 但没有找到 另一个问题 我需要这些方法 以便我可以过滤文件 有些是AND过滤器 有些是OR过滤器 就像集合论中的那样 所以我需要根据所有文件和保存这些文件的联合 相交 ArrayList 进行过滤 我
  • Java中有没有一种方法可以通过名称实例化一个类?

    我正在寻找问题 从字符串名称实例化一个类 https stackoverflow com questions 9854900 instantiate an class from its string name它描述了如何在有名称的情况下实例
  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 检测并缩短字符串中的所有网址

    假设我有一条字符串消息 您应该将 file zip 上传到http google com extremelylonglink zip http google com extremelylonglink zip not https stack
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Cucumber 0.4.3 (cuke4duke) 与 java + maven gem 问题

    我最近开始为 Cucumber 安装一个示例项目 并尝试使用 maven java 运行它 我遵循了这个指南 http www goodercode com wp using cucumber tests with maven and ja
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会

随机推荐

  • 程序员成长为架构师必备的十项技能

    一 卓越的程序员 1 每个好架构师都是一位出色的程序员 架构师 听起来是如此神秘的一个称号 尤其是在开发领域刚入门不久的菜鸟级程序员眼中 架构师都是高手 都是牛人 都是如此高高在上的存在 不过 在搞了四 五年编程之后 程序员们往往早已失去了
  • 【IT之路】LoadRunner系列-Win7 64bit下搭建Loadrunner11破解版

    一直想提升下性能测试知识 但是都因为这样那样的原因 没有实际上系统梳理下 在此 刚好空出时间来了 一步步把性能测试知识重新拾一下 本文介绍的是在vmware的环境下进行的Loadrunner环境搭建 一 环境准备 Win7 64bit Lo
  • 云计算基础知识:

    云计算 cloud computing 是分布式计算的一种 指的是通过网络 云 将巨大的数据计算处理程序分解成无数个小程序 然后 通过多部服务器组成的系统进行处理和分析这些小程序得到结果并返回给用户 云计算早期 简单地说 就是简单的分布式计
  • 数据结构(一)数组

    概述 说起数组我们都不陌生 几乎在每一种编程语言中 基本上都会有数组这种数据类型 不仅如此它还是是最基础最简单的数据结构 尽管如此 可能还是有一些人并没有真正的理解这个基础数据结构的精髓所在 首先 我们都知道 在java中数组是从 0 开始
  • Linux-epoll机制

    主要接口 epoll create epoll ctl epoll wait epoll create 头文件 include
  • Windows核心编程:字符和字符串处理

    Windows核心编程 字符和字符串处理 1 字符编码 ANSI 字符 一个字符一字节 8位 最多只能表达256个字符 UTF 的全称是Unicode Transformation Format Unicode转换格式 UTF 16 将 每
  • Transformer哲学

    一切苦痛 皆为过往 当我们科研遇到困难时 请大胆寻求Transformer的帮助吧 Transformer用一种苍老的声音问询 你有什么 你要什么 你怎么给我这些东西 一个翻译任务 我有英文 我需要中文 我以embedding形式给 一个目
  • Spring的@Component 、@Value 和 Springboot 的 @Component 、@ConfigurationProperties 使用

    application yml配置 book name 一个人的朝圣 author 蕾秋 乔伊斯 age 35 Spring的 Value 程序代码里 Spring主要在 Value注解的参数中使用EL表达式 注入普通字符串 注入操作系统属
  • C++异常处理机制的详细介绍

    1 C 异常处理的套路 1 1 C 异常处理机制之抛出异常关键字 throw 1 2throw关键字的使用 在哪可能出现异常就在哪里使用throw关键字抛出异常 这个异常可以使用一个常量 字符串 或类对象 都可以来抛出 throw 常量 字
  • 最佳买卖股票时机含冷冻期

    题目 给定一个整数数组 其中第 i 个元素代表了第 i 天的股票价格 设计一个算法计算出最大利润 在满足以下约束条件下 你可以尽可能地完成更多的交易 多次买卖一支股票 你不能同时参与多笔交易 你必须在再次购买前出售掉之前的股票 卖出股票后
  • 手游SDK-悬浮球

    一 游戏内显示悬浮球 手游SDK的悬浮球和一般的悬浮窗有点不一样 它只需要在游戏内显示即可 不需要也不能在桌面中显示出来 所以如果使用WindowManager创建悬浮窗 需要监听App是否在前台 如果在 则显示 如果不在则隐藏悬浮窗 而A
  • yolov7 姿态 pose训练部署笔记

    目录 pytorch开源相关资料 有tensorrtc 代码 预测时间测试结果 导出onnx代码
  • oppor15android版本8.1,OPPO R15搭载最新ColorOS 5.0系统,基于安卓8.1更好用

    原标题 OPPO R15搭载最新ColorOS 5 0系统 基于安卓8 1更好用 手机的发展十分之快 硬件性能普遍过剩 而手机系统的更新迭代变得异常重要 而越来越多的消费者也意识到这个问题 想获得更好的使用体验 不仅仅是硬件上的支持 操作系
  • Unity学习日志_动画系统简介

    Unity学习日志 动画系统简介 Animation Legacy动画系统 若要使用Animation 需要在创建Clip之前为物体手动添加Animation组件 Animation组件面板 属性 Animation 动画片段 Animat
  • Linux安装cuda如何修改目录,Ubuntu 18.04下安装CUDA 9.1或者9.2详细步骤

    在Ubuntu 18 04操作系统下安装CUDA 9 1 9 1 85 或者CUDA 9 2 9 2 148 版本的详细步骤 本文以安装CUDA 9 1为例 如果是安装CUDA 9 2 则相关参数修改为CUDA 9 2匹配的即可 1 下载c
  • vue项目运行至ipad白屏问题

    Vue做了一个单页面应用 它在一切设备上都工作正常 在调试另一个dug时 发现了这个问题 项目在其他端都可以正常打开 只有在paid上打开时 显示的是白屏状态 在刚开始解决这个问题时 花费了好几个小时都没解决 都准备从新编译代码了 发现并没
  • 数学建模学习笔记——线性规划

    数学建模学习笔记 线性规划 一 基础知识储备 1 线性规划 1 1标准形式 1 2非标准形式 1 3多目标规划 2 运输问题 3 指派问题 4 对偶理论与灵敏度分析 二 章节习题解答 Q3 Q4 Q5 Q6 Q8 Q9 本文章为 数学建模算
  • Unity 3D 博客汇总

    附录 X4 作业优秀博客汇总 目录 文章目录 附录 X4 作业优秀博客汇总 1 最有价值个人博客 Valuable Person Blogs 2 博客表达技巧与游戏创新 2 1 写读者欢迎的游戏博客 2 2 师兄师姐谈游戏创新 竞赛经验谈
  • Vector、deque、list三者之间的区别!!!

    vector 是一段连续的内存块 而deque 是多个连续的内存块 list 是所有 数据元素分开保存 可以是任何两个元素没有连续 vector 的查询性能最好 并且在末端增加数据也很好 除非它重新申请内存段 适合高效地随机存储 list
  • Java问题诊断和排查工具(查看JVM参数、内存使用情况及分析等)

    JDK自带的工具 在JDK的bin目录下有很多命令行工具 我们可以看到各个工具的大小基本上都稳定在27kb左右 这个不是JDK开发团队刻意为之的 而是因为这些工具大多数是jdk lib tools jar类库的一层薄包装而已 他们的主要功能