应用场景
内存不足、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