老铁们,今天咱们聊聊一个老生常谈的问题:内存占用贼高的线程怎么找? |
- 首先,你需要一个“神器”:jstat 命令
- 用它来观察内存使用情况
- 敲入命令:jstat -gc (pid是你的程序进程ID)
- 盯住S0C、S1C、EC、OC 这些内存区域的变化
如果这些指标蹭蹭蹭往上窜,说明内存可能要爆了! 别慌,我们接着往下看 |
- 第二步,祭出终极武器:jmap 命令
- 敲入命令:jmap -histo (pid还是你的程序进程ID)
- 输出结果会列出每个类的实例数量,以及占用内存大小
- 找到占用内存最大的那个类,一般就是罪魁祸首了
- 注意,别看最上面的,因为可能只是基本数据类型,比如String、Integer啥的
- 往下翻翻,找找那些名字听起来就很复杂的类,十有八九就是它了
|
- 第三步,终极奥义:jstack 命令
- 敲入命令:jstack (pid你懂的 )
- 它会输出当前所有线程的堆栈信息,包括线程名称、线程状态
- 找到占用内存最多的类所在的线程,看看它到底在干嘛
- 如果它在拼命干活,说明你的代码可能设计有问题,需要优化
- 如果它在睡觉,说明可能是某个地方卡住了,需要排查
|
总结一下:这三个命令组合拳,基本上能搞定大多数内存占用问题了,老铁们,赶紧试试吧! |
![](https://tse3-mm.cn.bing.net/th/id/OIP-C.KJx80a5NBakRoHPAoF8AUQHaEK?w=.jpg)