Java jmap 怎么用

你有没有过这样的经历:运行中的Java程序突然变卡,甚至莫名崩溃,你想看看内存里到底堆着哪些“吃内存的家伙”,却不知道从哪下手?其实,JDK自带的一个工具就能帮你搞定——jmap。

很多人一听“工具”就觉得复杂,其实它一点都不难懂。就像你打开冰箱想找吃的,jmap就是帮你把冰箱里的东西全列出来的清单,还能告诉你哪些是新鲜的、哪些已经快过期了。接下来咱们就一步步说清楚,这个“冰箱清单工具”到底怎么用。

Java jmap 怎么用

先搞懂:jmap能帮你做什么

简单来说,jmap的核心作用就是“看Java进程的内存快照”。举个生活化的例子:你把Java程序当成一个小超市,超市里的货架就是内存,商品就是各种对象。jmap就能帮你盘点货架上的东西——比如有多少瓶牛奶、多少袋面包,哪些商品卖不动(占内存多但没人用),甚至能帮你把整个货架的清单拍下来保存。

它常用的功能主要有两个:一是直接看内存里的对象数量和大小,二是把内存里的所有对象导出成文件,方便后续用工具分析。

第一步:先找到要查的Java进程

用jmap的前提,得知道你要查的那个Java程序的进程ID(PID)。怎么找呢?打开电脑的命令行(Windows用CMD,Mac/Linux用终端),输入jps回车,它会列出你电脑上所有运行的Java进程,格式大概是这样:1234 MyApp。这里的1234就是进程ID,MyApp是你程序的名字,记下来这个数字就行。

比如你电脑上运行着一个叫“订单系统”的Java程序,jps查出来PID是5678,接下来的操作就围绕这个5678展开。

第二步:用jmap看内存里的“商品盘点表”

最常用的命令就是jmap -histo PID,这里把刚才的PID换成你的数字,比如jmap -histo 5678。这个命令会输出一张“商品表”:每一行是一个对象类型,后面跟着这个类型有多少个实例、占了多少字节。

举个例子,输出里可能会显示:20000 1500000 java.lang.String,意思是内存里有2万个字符串对象,一共占了150万字节(差不多1.5MB)。如果突然看到有几十万甚至上百万个相同的对象,那大概率就是“内存泄漏”的信号——就像超市里进了一批滞销商品,堆在货架上占地方,怎么都卖不出去。

不过要注意,这个命令运行的时候,会让程序暂时停顿一下,就像你盘点超市的时候,顾客暂时不能随便拿东西,所以别在用户高峰期用,不然会影响正常使用。

第三步:把“货架清单”导出,深度分析

如果想知道这些对象到底是哪里来的,就得用导出功能——jmap -dump:format=b,file=文件名.hprof PID。比如你想把5678进程的内存导出成order_dump.hprof文件,命令就是jmap -dump:format=b,file=order_dump.hprof 5678。

这个文件就像超市的进货清单,里面记着每个商品的来源、进货时间。导出后,你可以用专门的工具(比如JDK自带的jhat,或者更流行的VisualVM、Eclipse MAT)打开,看看哪些对象被多余的引用牵着,没法被垃圾回收掉——这就是最常见的内存泄漏原因,就像超市里的滞销商品被错误地挂在货架上,没法下架。

最后再提醒一句:jmap是JDK自带的工具,不用额外安装,只要你电脑上装了JDK,就能直接用。它不是用来“修改内存”的,只是帮你“看清内存”,就像清单只能看不能改,别乱用命令,不然可能会导致程序出问题。

上一篇 Swift语言核心特性解析 如何用它高效开发跨平台应用