JVM提供的监控命令:jmap。

应用场景

内存不足、OutOfMemoryError

生产中Java应用服务发生OutOfMemoryError属于“家常便饭”,发生了OutOfMemoryError或者发现内存不足报警时,我们需要找到原因,查出内存问题。jmap在这个场景中是用来定位问题的主要工具,他主要用来查看Java进程对内存的使用情况。

jmap是JDK自带的监控工具,在JDK的根目录中可以找到。

示例1

按照占用空间的大小打印程序中类的列表,从这个列表中可以分析哪些类占用了比较多的内存,再结合代码找到问题的所在。

  • jmap -histo:live 2743

示例输出

示例2

按照占用空间的大小打印程序中加载的动态链接库的列表,其实,Java进程在操作系统中会加载多个本地动态链接库,Java进程本身和动态链接库都会在其占用的虚拟地址空间上分配内存。Java的堆和栈等内存空间分配在Java进程中,Java的直接内存会分配在Java进程堆内存外或者依赖的动态链接库上,因此,此命令可以帮助定位Java进程占用内存较大或者底层动态链接库占用内存较大的问题,在定位Java进程导致的内存泄漏场景中有很重要的作用。

  • jmap 2743

示例输出

示例3

Java堆的内存结构很复杂,包括新生代、老年代、持久代、直接内存等,通过jmap命令可以查看堆的概要信息。

  • jmap -heap 38574

示例输出

示例4

有些Java内存问题不是显而易见的,从类、动态链接库、堆的概要信息的角度无法定位具体产生的原因,我们需要对Java堆的内存结构进行剖析才能进一步分析产生问题的根本原因,这通常通过jmap命令导出Java堆的快照,然后通过其他工具甚至可视化内存分析工具(例如:JHAT、JMAT、JProfiler、JConsole、JVisualVM)等进行详细分析。

  • jmap -dump:format=b,file=./heap.hprof 2743

示例输出

猜你喜欢

转载自blog.csdn.net/en_joker/article/details/87711219