JVM

2022-04-22  本文已影响0人  想成为大师的学徒小纪

一、JVM监控及排查分析命令详解

1、jps

JVM Process Status Tool,用于显示指定系统内所有的HotSpot虚拟机进程。

usage: jps [options] [hostid]     #hostid可以省略

options:
    -l  显示pid和应用程序main class的完整包名或者应用程序的jar路径
    -q  只显示 pid
    -m  显示pid、应用程序main class类名和传递给main方法的参数,在嵌入式jvm上可能是null
    -v  显示pid、应用程序main class类名和传递给jvm的参数
    -V  默认,显示pid和应用程序main class类名

2、jstat

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

usage: jstat [option] [-t] [-h<lines>] LVMID [interval] [count]
    [interval]: 连续输出的时间间隔
    [count]: 输出的次数

options:
    -class  显示有关类加载器行为的统计信息
    -compiler  显示有关Java HotSpot VM即时编译器行为的统计信息。
    -gc  显示有关垃圾收集堆行为的统计信息。
    -gccapacity  显示各个垃圾回收代容量及其对应空间的统计信息。
    -gccause  显示有关垃圾收集统计信息的摘要(与 -gcutil 相同),以及最后和当前(如果适用)垃圾收集事件的原因。
    -gcnew  显示新生代行为的统计信息。
    -gcnewcapacity  显示有关新生代及其对应空间大小的统计信息。
    -gcold  显示有关老年代行为的统计信息和元空间统计信息。
    -gcoldcapacity  显示有关老年代大小的统计信息。
    -gcmetacapacity  显示有关元空间大小的统计信息。
    -gcutil  显示有关垃圾收集统计信息的摘要。
    -printcompilation  显示Java HotSpot VM编译方法统计信息。


-t:将时间戳列显示为输出的第一列。时间戳是自目标JVM启动时间以来的时间。
-h n:每n个样本(输出行)显示一个列标题,其中n是一个正整数。默认值为0,即显示列标题的第一行数据。

3、jmap

打印进程、核心文件或远程调试服务器的共享对象内存映射或堆内存详细信息。

除此命令外,通过指定-XX:+HeapDumpOnOutOfMemoryError参数,在发生OutOfMemoryError时生成堆dump文件。或者使用hprof命令也可以生成。

usage: jmap [ options ] pid
       jmap [ options ] executable core
       jmap [ options ] [ pid ] server-id@ ] remote-hostname-or-IP
    executable:生成可执行的核心转储文件
    core:打印内存映射的核心文件
    remote-hostname-or-IP:远程调试服务器主机名或IP地址
    server-id:当多个调试服务器在同一远程主机上运行时使用的可选唯一ID

options:
    <none>  如果不使用任何选项,jmap命令会打印共享对象映射。对于目标JVM中加载的每个共享对象,都会打印共享对象文件的起始地址、映射大小和完整路径
    -dump:[live,] format=b, file=filename
        以hprof二进制格式生成堆转储文件。live子选项是可选的,当指定时,仅转储堆中的活动对象。要浏览堆转储文件,可以使用jhat命令读取。
    -finalizerinfo  打印有关等待回收的对象的信息
    -heap  打印堆的概要信息,包括GC、head configuration、generation-wise heap usage等
    -histo[:live]  打印堆的对象统计,包括对象数、内存大小等等
    -clstats  打印堆的类加载器统计信息。
    -F  强制。当pid没有反应时,将这个选项与jmap -dump或jmap -histo选项一起使用。在这种模式下不支持live子选项。
    -Jflag  将flag传递给运行jmap命令的Java虚拟机。

description:
    jmap命令打印指定进程、核心文件或远程调试服务器的共享对象内存图或堆内存细节。
    如果指定的进程在64位Java虚拟机(JVM)上运行,那么你可能需要指定-J-d64选项,例如:jmap -J-d64 -heap pid。
oql语句帮助页面

4、jstack

打印 Java 进程、核心文件或远程调试服务器的 Java 线程堆栈跟踪。

usage: jstack [ options ] pid
       jstack [ options ] executable core
       jstack [ options ] [ server-id@ ] remote-hostname-or-IP
    executable:生成可执行的核心转储文件
    core:打印内存映射的核心文件
    remote-hostname-or-IP:远程调试服务器主机名或IP地址
    server-id:当多个调试服务器在同一远程主机上运行时使用的可选唯一ID

options:
    -F  当jstack [-l] pid没有反应时,强制进行堆栈转储
    -l  打印关于锁的额外信息
    -m  打印一个混合模式的堆栈跟踪,其中有Java和本地C/C++框架,该选项不适用于远程调试服务器

description:
    jstack命令打印指定的Java进程、核心文件或远程调试服务器的Java线程的堆栈痕迹。对于每个Java框架,如果有的话,会打印完整的类名、方法名、字节码索引(BCI)和行号。当指定的进程在64位Java虚拟机上运行时,你可能需要指定-J-d64选项,例如:jstack -J-d64 -m pid。
    

5、jinfo

生成配置信息,实时查看和调整虚拟机运行参数。

usage: jinfo [ option ] pid
       jinfo [ option ] executable core
       jinfo [ option ] [ servier-id ] remote-hostname-or-IP
    executable:生成可执行的核心转储文件
    core:打印内存映射的核心文件
    remote-hostname-or-IP:远程调试服务器主机名或IP地址
    server-id:当多个调试服务器在同一远程主机上运行时使用的可选唯一ID


options:
    <none>  打印命令行参数和系统属性名称-值对
    -flag name  打印指定命令行参数的名称和值
    -flag [+|-]name  启用或禁用指定的布尔值命令行参数
    -flag name=value  将指定的命令行参数设置为指定的值
    -flags  打印传递给JVM的命令行参数
    -sysprops  将Java系统属性打印为名称-值对

description:
    jinfo命令打印指定Java进程或核心文件或远程调试服务器的Java配置信息。配置信息包括Java系统属性和JVM命令行标志。如果指定的进程在64位JVM上运行,那么您可能需要指定-J-d64选项,例如:jinfo -J-d64 -sysprops pid。

二、常见JVM内存错误问题排查

1、Java heap space

当堆内存(Heap Space)没有足够空间存放新创建的对象时,就会抛出java.lang.OutOfMemoryError: Java heap space 错误。

2、GC overhead limit exceeded

当Java进程花费98%以上的时间执行GC,但只恢复了不到2%的内存,且该动作连续重复了5次,就会抛出java.lang.OutOfMemoryError: GC overhead limit exceeded 错误。简单地说,就是应用程序已经基本耗尽了所有可用内存,GC也无法回收。

此类问题的原因与解决方案跟 Java heap space 非常类似,可以参考上文。

3、Permgen space

java.lang.OutOfMemoryError: Permgen space该错误表示永久代(Permanent Generation)已用满。

4、Metaspace

JDK 1.8使用Metaspace(元空间)替换了永久代(Permanent Generation),java.lang.OutOfMemoryError: Metaspace该错误表示Metaspace已被用满。

此类问题的原因与解决方法跟Permgen space非常类似,可以参考上文。需要特别注意的是调整Metaspace空间大小的启动参数为 -XX:MaxMetaspaceSize

5、Unable to create new native thread

每个Java线程都需要占用一定的内存空间,当JVM向底层操作系统请求创建一个新的native线程时,如果没有足够的资源分配就会报此类错误java.lang.OutOfMemoryError: Unable to create new native thread

6、Out of swap space?

java.lang.OutOfMemoryError: Out of swap space?该错误表示所有可用的虚拟内存已被耗尽。虚拟内存(Virtual Memory)由物理内存(Physical Memory)和交换空间(Swap Space)两部分组成。当运行时程序请求的虚拟内存溢出时就会报 Out of swap space? 错误。

7、Direct buffer memory

DirectByteBuffer顾名思义直接缓冲,我们可以使用它进行堆外内存的分配/使用/回收。DirectByteBuffer晋升到老年代,必须要等到full gc 才有可能被回收。当DirectByteBuffer使用较多且存活时间过长的情况时,则可能造成堆外内存OOM出现java.lang.OutOfMemoryError: Direct buffer memory错误

上一篇下一篇

猜你喜欢

热点阅读