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

15 篇文章 1 订阅
订阅专栏

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

qifuguang.me

其他工具

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

View Code

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

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

Smart Java thread dump analyzer - thread dump analysis in seconds:线程栈分析的网站

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

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

硬盘使用情况:du 命令

内存使用且情况:free 命令

CPU使用情况:top 命令

网络使用情况:netstat 命令

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

java打印内存数_如何打印java对象的内存使用情况
weixin_33250594的博客
02-24 2062
在以下问题中:Possible Spring Boot or Spring Security Memory Leak用户按如下方式打印java对象:num #instances #bytes class name----------------------------------------------1: 395984 32564344 [C...
一文深度讲解JVM 内存分析工具 MAT及实践(建议收藏),应届生面试java开发工程师的题库及答案
最新发布
2401_84438893的博客
04-21 606
可以使用 Distinct 关键词去重。我为什么要写这篇文章呢,其实我觉得学习是不能停下脚步的,在网络上和大家一起分享,一起讨论,不单单可以遇到更多一样的人,还可以扩大自己的眼界,学习到更多的技术,我还会在csdn、博客、掘金等网站上分享技术,这也是一种学习的方法。我为什么要写这篇文章呢,其实我觉得学习是不能停下脚步的,在网络上和大家一起分享,一起讨论,不单单可以遇到更多一样的人,还可以扩大自己的眼界,学习到更多的技术,我还会在csdn、博客、掘金等网站上分享技术,这也是一种学习的方法。
java jvm 内存查看
weixin_66109360的博客
01-14 3935
Runtime对java的运行环境进行的封装,可以得到jvm的状态信息,使用Runtime.getRuntime ()就可以得到Runtime的引用。. 使用Runtime的maxMemory (),totalMemory (),freeMemory ()几个方法就可以得到jvm内存使用情况maxMemory是jvm可以从操作系统可以获得最大内存,totalMemory是jvm已经分配到的内存大小,freeMemory是所分配内存的剩余大小,可以通过代码运行查看
命令查看jvm内存使用情况 年轻代 老年代(1)
m0_72758098的博客
04-20 982
当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了。
一文深度讲解JVM 内存分析工具 MAT及实践(建议收藏)
m0_63437643的博客
05-05 8073
1. 前言熟练掌握 MAT 是 Java 高手的必备能力,但实践时大家往往需面对众多功能,眼花缭乱不知如何下手,小编也没有找到一篇完善的教学素材,所以整理本文帮大家系统掌握 MAT 分析工具。本文详细讲解 MAT 众多内存分析工具功能,这些功能组合使用异常强大,熟练使用几乎可以解决所有的堆内存离线分析问题。我们将功能划分为4类:内存分布详情、对象间依赖、对象状态详情、按条件检索。每大类有多个功能点,本文会逐一讲解各功能的场景及用法。此外,添加了原创或引用案例加强理解和掌握。如图所示:​编辑切换为居中添加图
如何监控和诊断JVM堆内和堆外内存使用
雪雪
04-27 1581
这里有一个相对特殊的部分,就是是堆外内存中的直接内存,前面的工具基本不适用,可以使用 JDK 自带的 Native Memory Tracking(NMT)特性,它会从 JVM 本地内存分配的角度进行解读。对于堆内存,我在上一讲介绍了最常见的新生代和老年代的划分,其内部结构随着 JVM 的发展和新 GC 方式的引入,可以有不同角度的理解,下图就是年代视角的堆结构示意图。在 JMC 或 JConsole 的内存管理界面,会统计部分非堆内存,但提供的信息相对有限,下图就是 JMC 活动内存池的截图。
JAVA内存溢出后怎么打印和分析dump文件
木槿
03-04 1413
配置完后,如果后续程序发生溢出,会生成快照文件(文件后缀.hprof),一般dump文件都比较大,需要特定的工具进行分析。设置jvm参数,当内存溢出时输出Dump文件,dump文件名格式为xxx.hprof。还可以点击其他相关tab进行查看实例数等,该工具还支持JMX连接等远程方式分析。可使用JDK自带的jvisualvm、Jprofile、MAT等。解决程序问题,无限循环、对象或引用未释放等。点击异常线程会显示发生异常时的日志。等可以分析图或GC根路径等。可以增加内存大小的配置。
JVM内存问题排查
01-09
初步诊断思路考虑是不是这台机器上的某个服务把内存撑爆了,所以开始排查内存问题使用jdk自带脚本,进行内存诊断分析。 1.查看所有Java应用占用的进程(linux常用的是ps -ef|grep java) jps -l 2.查看需要监控...
jvm工具参数调优&调试技巧.doc
09-13
7. **VisualVM**:这是一个集成的故障处理工具,包含多种功能,如性能监视、内存分析、线程分析等,是开发者常用的JVM工具。 8. **jconsole**:它提供图形界面来监控Java应用程序,包括CPU使用率、内存使用、线程...
Arthas - Java 诊断利器.docx
09-10
这个工具的主要目的是帮助开发者在遇到线上问题时能够迅速定位并解决,它提供了丰富的功能,包括动态跟踪代码、实时监控JVM状态以及在线查看分析Java应用的运行情况。 ### 安装与启动Arthas 安装Arthas非常简单,...
JAVA线上常见问题排查手段汇总
09-07
- **Garbage Collection(GC)分析**:对于内存问题,关注Java应用的GC行为,使用`jconsole`或`VisualVM`等工具监控GC状态,找出可能导致内存问题的模式。 - **网络问题**:网络延迟或连接问题也可能影响性能,...
java内存监控工具jvisualvm
05-06
监控工具VisualVM VisualVM 是Netbeans的profile子项目,能够监控线程,内存情况查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。这个软件是基于NetBeans开发的了。 从界面上看还是比较简洁的,左边是树形结构,自动显示当前本机所运行的Java程序,还可以添加远程的Java VM,其中括号里面的PID指的是进程ID。OverView界面显示VM启动参数以及该VM对应的一
java获得jvm内存大小
12-18
java获得jvm内存大小
1. JVM 内存结构的组成、各部分功能作用,学会利用内存诊断工具排查内存相关问题;2. JVM 的招牌-jvm.zip
01-30
1. JVM 内存结构的组成、各部分功能作用,学会利用内存诊断工具排查内存相关问题;2. JVM 的招牌-jvm
JVM学习四(JVM调优工具详解)
qq_45003354的博客
12-27 262
jvm调优工具和调优思路
JVM-常用工具(jps、jstat、jinfo、jmap、jhat、jstack、jconsole、jvisualvm)使用
BADAO_LIUMANG_QIZHI的博客
06-01 2178
记录JVM中常用工具
java深入理解jvm对象内存结构和大小分析(示范四种查看jvm中对象内容和大小的方式)
HumorChen的博客
02-11 4702
该对象的堆内存大小为16字节(不计算对象里指针引用的对象大小,也称为浅堆,如果递归计算引用的对象大小则称为深堆大小),对象状态信息8个字节,对象类型信息4个字节,属性chars的对象指针4个字节(两种不同方法查看对象大小的时候是会有差异的,反正两种方法看大小相差不会超过8字节)在jvm里分配内存是8字节为最小单位的,因此64为jvm假设按指针内存大小为4字节就可以拥有32G的寻址了,8字节则浪费掉了一半,因此jvm做了指针压缩技术,将64位机器上jvm的指针由原本的8字节减小到了4字节。
java内存占用排查
qq_36223335的博客
01-26 1810
1. 查看java进程 #获取进程号 ps -ef|grep java 2. 使用top命令查看内存占用 # 查看占用内存最多的线程 top -Hp 进程号 3. 将线程号转为16进制 printf "%x\n" 线程号 4. 使用jstack打印出当前线程的信息 jstack 进程号 | grep -20 线程16进制 5. 使用jstack 将线程信息输出到文本 jstack -l 进程号 >> jstack.log ...
查看 jvm 信息的常用命令
J_bean的博客
02-08 406
查看当前运行的java进程及jvm参数 jps -lvm 用于查看当前机器上运行的java进程。 命令行参数选项说明如下: -l 输出main类或Jar的全限名 -v 输出传入JVM参数 -m 输出传入main方法的参数 查询jvm内存区域划分及堆内存使用情况 jmap-heapPID 查询对象情况 jmap-histoPID 查询最大的20个对象 jmap -histo PID | head -20 查询最小的20个对象 jmap -...
java虚拟机报oom,如何使用arthas排查问题所在
05-25
当 虚拟机抛出 OutOfMemoryError(OOM)异常时,一种可能的原因是应用程序中存在内存泄漏或者内存使用过量的问题。要定位这个问题,可以使用阿里巴巴开源的 Java 诊断工具 Arthas。 下面是使用 Arthas 排查内存泄漏问题的一般步骤: 1. 在出现 OOM 异常时,使用 jps 命令查看应用程序的进程 ID。 ``` jps ``` 2. 使用 arthas-boot 命令启动 Arthas。 ``` java -jar arthas-boot.jar ``` 3. 在 Arthas 控制台中,使用 attach 命令连接到应用程序进程。 ``` attach <pid> ``` 4. 使用 dashboard 命令查看 JVM 的运行状况,包括堆内存、非堆内存和线程数等信息。 ``` dashboard ``` 5. 使用 heapdump 命令导出堆内存快照,保存为 hprof 文件。 ``` heapdump /tmp/dump.hprof ``` 6. 使用 jhat 命令打开 hprof 文件,查看对象占用内存情况。例如,可以查看对象的数量、大小和引用关系等信息。 ``` jhat /tmp/dump.hprof ``` 7. 根据内存快照和 jhat 工具分析结果,查找可能存在内存泄漏或者内存占用过多的代码。例如,可以查看对象的引用路径,找到可能的引用泄漏点。 ``` jhat http://localhost:7000/ ``` 8. 根据分析结果,进行代码优化或者修复内存泄漏问题。 注意:在使用 Arthas 进行诊断时,需要谨慎操作,避免对系统造成不必要的影响。同时,也需要注意保护敏感信息,避免泄露重要数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 在HTML中画一条横线 131480
  • jQuery取得select选中的值 87077
  • java中list集合删除其中的某一个元素 52791
  • sourceTree使用教程详解 46739
  • 多个div横向排列的几种方法 34410

分类专栏

  • java 15篇
  • 常用工具 16篇
  • 前端 19篇
  • 文档模板 10篇
  • 安全测试 6篇
  • 脚本 2篇
  • windows 4篇
  • C# 1篇
  • 其他 1篇
  • 面试总结 1篇
  • 大数据 1篇
  • python 1篇
  • JDK 3篇
  • redis 2篇
  • 路由配置 1篇
  • nginx简介 7篇
  • 数据库 21篇

最新评论

  • Nginx配置负载均衡

    2401_83974639: 文章结构严谨有条,层次分明,读起来一点也不费劲,让人受益匪浅。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • nginx动静分离配置

    2401_84870916: 大佬高质量文章,图文并茂,逻辑清晰,受益匪浅,期待大佬新作。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • java面试笔试题50道及答案

    天蓝999: 可以的,我看的另一篇,我面试时90%以上的题目在下边这个博客里:https://knife.blog.csdn.net/article/details/121219272

  • 在HTML中画一条横线

    很远海洋: 怎么改长度

  • Excel使用技巧大全

    阿里数据专家: AIGC ChatGPT ,BI商业智能, 可视化Tableau,PowerBI ,FineReport, 数据库Mysql Oracle,Office, Python 数据仓库Informatica Excel 2021 函数全集,高级图表,大屏可视化 以上---案例实战:http://t.csdn.cn/zBytu

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • sass详解
  • 针对ubuntu系统,如何更改环境变量中的网络代理
  • ubuntu系统更改下载源
2024年14篇
2023年6篇
2022年30篇
2021年27篇
2020年18篇
2019年74篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司福永网站排名优化东莞SEO按天收费布吉seo优化爱联SEO按天扣费坪地营销型网站建设盐田关键词排名包年推广南澳建设网站南澳百姓网标王推广广州网站关键词优化横岗网站建设大鹏阿里店铺托管福永模板制作大鹏建站罗湖网站搜索优化惠州如何制作网站塘坑网站设计南澳关键词按天收费平湖模板推广大鹏网站优化按天收费观澜网站seo优化荷坳优化龙华网站推广永湖百度关键词包年推广宝安百度标王东莞英文网站建设民治模板推广石岩阿里店铺运营南联网站搭建双龙网站优化排名大芬网站优化按天收费歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化