JVM监控工具之命令行篇

一、概述

  • 使用数据说明问题、使用知识分析问题、使用工具处理问题
  • 无监控、不调优,因为没有一次性的处理,所有需要根据实际情况才能调优

二、jps-查看正在运行的java进程

1、基本情况

jps(java Process Status):

显示指定系统内所有HotSpot虚拟机进程(查看JVM进程信息),用于查询正在运行的JVM进程。

对于本地JVM进程来说,进程的本地虚拟机ID和操纵系统的进程ID是一只的,也是唯一的。

2、测试

3、基本语法

  • -q:仅仅显示LVMID,即本地虚拟机唯一ID。不显示主类名称等
  • -l:输出应用程序的全类名或者jar包的完成路径
  • -m:输出虚拟机启动进程时出传递给主类的main()的参数
  • -v:列出虚拟机启动时候的JVM参数

如果java进程关闭了默认开的UsePerfData参数,那么jps无法感知java进程(jstat一样) 

三、jstat-查看JVM统计信息

1、基本情况

jstat(JVM Statistics Monitoring Tool):用于监视JVM各种运行状态的命令行工具。他可以显示本地或者远程JVM中的类装载、内存、垃圾回收、JIT编译等运行数据。

在没有GUI工具情况下,它是定位性能问题的首选。常用于检测垃圾回收问题以及内存泄漏问题。

2、基本语法

1、option参数

  • 类状态相关:
    • -class:显示ClassLoader相关信息,类的状态、卸载数量、总空间、类装载所消耗的时间等
  • 垃圾回收相关:
    • -gc:显示GC相关的堆信息。包括Eden、s0、s1、老年代、永久代的容量、已用空间、GC时间合集等信息
    • -gccapacity:显示内容与-gc基本相同,主要输出堆中各区域使用到最大、最小空间
    • -gcutil:显示内容与-gc基本相同,主要输出已使用空间占总空间的百分比
    • -gccause:与-gcutil相同,但是输出正在进行的GC或者最后一次GC的原因
    • -gcnew:显示新生代的GC情况
    • -gcnewcapacity:显示内容与-gcnew基本相同,输出主要关注使用到的最大空间、最小空间
    • -geold:显示老年代GC状况 
  • JIT相关的:
    • -compiler:显示JIT编译器编译过的方法、耗时等信息
    • -printcompilation:输出已经被JIT编译的方法 

2、interval参数:打印的时间间隔,便于持续监控

3、count参数:打印次数

4、-t参数:应用执行时间,单位秒,能够计算出垃圾回收占运行时间,如果超过20%,堆压力很大,如果占比90%则证明90%都在GC

5、-h参数:输出表头

3、补充

jstat判断程序是否出现内存泄漏:

1、在长时间运行的java程序中,可以取OU(old used)列的最小值

2、每隔一段时反复取值,如果这些值呈上涨趋势,则有可能存在内存泄漏 

四、jinfo-实时查看和修改JVM参数

1、基本情况

jinfo(Configuration Info For Java):查看JVM牌纸参数信息,也可以用于调整JVM的配置参数。在很多情况下,JVM应用程序不会指定所有所有JVM参数。开发人员可以使用jinfo查看应用设置的虚拟机参数的值。

2、基本语法

1、查看

  • jinfo -sysprops PID:查看程序使用System.getProperties()
  • jinfo -flags PID:曾经赋值过的参数
  • jinfo -flag 参数名 PID:查看某个参数的值

2、修改:能够修改的参数是有限的 java -XX:+PrintFlagsFinal -version | grep manageable 查看

  • 针对boolean:jinfo -flag (+|-) 具体参数 PID
  • 针对非boolean:jinfo -flag 具体参数=值 PID

3、拓展

  • java -XX:PrintFlagsInital:查看所有JVM参数启动的初始值
  • java -XX:PrintFlagsFinal:查看所有JVM参数的最终值
  • java -XX:PrintCommandLineFlags:查看那些已经被用户或者JVM设置过的详细的XX参数名称和值

五、jmap-倒出内存映像文件&内存使用情况

1、基本情况

jmap(JVM Memory Map):作用一是获取dump文件(堆的存储快照、二进制文件),它还可以获取目标java进程的内存相关信息,包括java堆各区域的使用情况,堆中对象的统计信息,类加载信息等。

2、基本语法

  • -dump:生成堆转储快照dump文件,-dump:live 只保存堆中存活的对象
  • -heap:输出整个堆空间的详细信息,包括GC的使用,堆配置信息,以及存储的对象信息
  • -histo:输出堆中对象的统计信息,包括类、实例数量和合计容量,-histo:live值统计存活的对象
  • -permstat:以ClassLoader为统计口径输出永久代的内存状态信息
  • -finalizerinfo:显示在F-Queue中等待Finailzer线程执行finalize方法的对象
  • -F:当前JVM进程多-dump选项没有任何响应时,强制生成dump文件
  • -h|heap:帮助命令
  • -j:传递参数给jmap启动的jvm 

3、使用

自动导出的时候会先执行一次FullGC,针对大内存导出的时间会比较长。

  • 使用1:导出内存映像文件
    • 手动方式:尽量使用live,这样dump文件比较小
      • jmap -dump:format=b,file=<filename.hprof> PID
        • format=b,让其它工具能够打开dumo文件
      • jmap -dump:live,format=b,file=<filename.hprof> PID 
    • 自动方式:在系统OOM的时候,会自动生成dump文件
      • -XX:+HeapDumpOnOutOfMemoryError:发生OOM的时候,保存dump文件
      • -XX:+HeapDumpPath=<filename.hprof>:保存地址
  • 使用2:显示对内存相关信息
    • jmap -heap PID:显示时间点上堆空间各个部分使用情况
    • jmap -histo PID:时间点上内存中对象的占用的堆少
  • 其它作用
    • jmap -permstat PID:查看系统的CLassLoader信息
    • jmap -finalizerinfo:查看堆积在finalizer队列中的对象信息

4、小结

由于jmap将访问堆中所有的对象,为了保证在此过程中不被应用线程干扰,jmap需要借助安全点机制,让所有线程停留在不改变对中数据的状态,也就是说jmap导出的对快照必定是安全点位置的。这可能导致给予该对快照的分解结果存在偏差。

举个例子,假设在编译生成的机器码中,某些对象的生命周期在两个安全点之间,那么:live选项将无法探知这些对象。

另外,如果某个线程长时间无法跑到安全点,jmap会一直等下去,与前面讲的jstat不同,垃圾回收器会注定讲jstat所需要的摘要数据保存至固定位置之中,jstat只需要直接读取即可。

六、jhat-JDK自带堆分析工具

1、基本情况

jhat(JVM Heap Analysis Tool):是JDK提供的与jmap一起使用分析工具,分期jmap导出的dump文件。jhat内置了http服务器,生成dump结果后可以浏览器查看。

jhat在jdk9之后已经被删除,官方建议使用VisualVM代替。

2、基本语法

七、jstack-打印JVM中线程快照

1、基本情况

jstack(JVM stack Trace):用户生成虚拟机指定进程当时线程快照(虚拟机堆栈跟踪)。线程快照就是当前虚拟机内指定进程的每条线程正在执行的方法堆栈的集合。

主要用于线程长时间卡顿,如线程死锁、死循环、请求外部资源导致长时间等待的问题。

在线程快照中,留意一下状态:

  • 死锁,Deadlock
  • 等待资源,Waiting on condition
  • 等待获取监视器,Waiting on monitor entry
  • 阻塞,Blocked
  • 执行中,Runnable
  • 暂停,Suspended
  • 对象等待,Object.wait() 或 TIME_WAITING
  • 停止,Parked

2、基本语法

  • -F:当请求不被响应的时候,强制输出
  • -l:除堆栈外,显示关于锁的附加信息
  • -m:如果调用到本地方法的话,显示C或C++堆栈
  • -h:帮助文档

可以在代码中使用 Tread.getAllStackTraces()

八、jcmd-多功能命令行

1、基本情况

在JDK1.7之后,新增了一个命令行工具jcmd。它是一个多功能工具,可以实现除了jstat之外的所有命令功能。如导出dump、内存使用、查看java进程、导出线程信息、执行GC\JVM运行时间。

2、基本语法

  • jcmd -l:列出所有JVM线程
  • jcmd pid help:列出线程支持命令
  • jcmd pid 集体命令:执行某个线程的具体命令

九、jstatd-远程个主机信息收集

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVM常用监控工具有很多,其中一个重要的工具就是dump分析工具。dump文件是指Java进程的内存快照,可以用于分析Java进程的内存使用情况,了解Java进程内部的情况。 下面介绍几个常用的dump分析工具: 1. jmap jmap是JDK自带的一个命令工具,可以生成Java进程的内存快照。使用jmap生成dump文件的命令如下: ``` jmap -dump:format=b,file=<filename> <pid> ``` 其中,format=b表示生成二进制格式的dump文件,file=<filename>表示指定保存dump文件的路径和文件名,<pid>表示Java进程的进程ID。 2. jstack jstack也是JDK自带的一个命令工具,可以打印Java进程的线程堆栈信息。使用jstack生成dump文件的命令如下: ``` jstack -F <pid> > <filename> ``` 其中,-F表示在进程不响应时强制获取线程堆栈信息,<pid>表示Java进程的进程ID,> <filename>表示将线程堆栈信息输出到指定文件。 3. VisualVM VisualVM是一个功能强大的Java监控和分析工具,可以监控和分析本地和远程Java进程。VisualVM可以生成Java进程的各种信息,包括dump文件。使用VisualVM生成dump文件的步骤如下: - 在VisualVM中打开需要生成dump文件的Java进程。 - 选择“Heap Dump”选项卡,点击“Heap Dump”按钮。 - 选择保存dump文件的路径和文件名,点击“Save”按钮。 4. Eclipse Memory Analyzer Eclipse Memory Analyzer是一款功能强大的Java内存分析工具,可以帮助开发人员分析Java进程的内存使用情况。Eclipse Memory Analyzer可以打开各种格式的dump文件,包括使用jmap、jstack和VisualVM生成的dump文件。 以上是常用的dump分析工具,可以帮助开发人员了解Java进程的内存使用情况。同时,需要注意的是,生成dump文件会对Java进程产生一定的影响,需要谨慎使用。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值