在做一个项目的时候发现内存在持续增长,cpu高速运转,想了老半天,也不知道是啥情况。
于是我决定,我要走进JVM内部,查看每个程序的内存、CPU、线程情况!
直到我看到了这样一篇文章
https://blog.youkuaiyun.com/gavin_john/article/details/52458542
在里面我注意到了一个Java自带的分析器jvisualvm
真的好用!使用起来超级方便,只需要在IDEA自带的Terminal输入jvisualvm就可以了!
打开以后界面是这样的:
左边是所有在JVM上跑着的Java程序,连pid也写出来了,你可以双击选择你要分析的Java进程。
内存分析
比如,我们选择IntelliJ来分析,双击后是这样的:
程序很容易使用,你去探索15分钟应该就上手了。
在这里可以查看所有线程,我提个建议,以后你在定义自己线程的时候给线程起一个名字,否则系统会用Thread-1、Thread-2以此类推来给创建的线程起名字。
然后在监视页面,可以查看很多参数,我重点要说的是这个堆Dump!点击这个按钮后,会生成一个此时的快照,所有的对象,你可以查看其内容、引用等。
点击堆Dump后进入这个页面:
我们进入类的选项卡:
内存占用高的时候,可以在这里查看内存占用比例,哦对了,所有你自己定义的类都可以在这里找到。
比如我们现在要看看都有哪些字符串,你可以去找String类,因为String的内容都在char[]里保存着对吧,所以我们直接双击char[]这个类,进到这个界面来:
你看到了吗,每一个char[]都可以看到内容。
下面有一个引用标签,这里面你可以看到它都在被谁引用。this是自己,所以我们重点要看的是下面的红点点。
行了,自己探索吧。
CPU线程分析
一种是点那个线程标签
另一种是打开抽样器
然后点那个CPU,这里会列出所有的线程,以及他们占用CPU的比例和情况。
行了,啥也不多说了, 自己探索吧!
反正我当时是直接看到了自己占用CPU过高的线程,然后打开对应线程的类,去分析发现了自己的问题。
毕竟!它连方法名都告诉你了啊!
线程名:
真是要啥有啥,舒服吧?
觉得有帮助的话,评论区说句话吧!欢迎转载,请指明出处。