这个问题在我第一次面试的时候就问到了,由于有准备所以答得不错,拿到了offer。可以说这个问题是你有没有真正理解JVM各类机制的关键。且听我娓娓道来。
由于这个问题一般不会有博主带你手把手做,我希望通过实践来检验我们的效果。我们开始进入主题。
一、打开Idea,在Idea下方找到Terminal
二、打开任务管理器,找到Idea的PID (这里是8152,每次启动idea都不一样)
三、返回Idea,学习第一个命令jmap,直接在Terminal内输入jmap
这一命令可以看出有很多操作 我们主要进行一项操作就知道jmap用来干嘛的了
jmap -histo:live PID(之后所有PID是你当前idea的PID)
结果如下:
弹出一大堆你看不懂的东西,但是并不妨碍我们记忆jmap的用处:用jmap查看个区域使用情况
四、jstack命令
老样子 我们直接输入jstack命令看看使用方法
仔细看jstack -l 和 -e 中的描述
只用看到最关键的词“locks”也就是说jstack命令可以查看各类锁的情况。而-e能看到“threads”,也就是说-e命令还可以查看线程,这两点便是我们需要记住jstack命令的效果。
五、jstat命令(强烈要求亲自打一遍)
老样子,直接输入jstat命令查看他能干什么
实在是太多了,这里教大家一个命令 jstat -gc PID 2000 50(后面两个参数为2000ms进行一次,一共进行50次),来看效果
弹出了非常多的信息,先看前六个。如果大家了解过JVM内存空间就知道,前面六个分别指两个survivor区和一个eden区。这种方法也是一种对内存空间可视化的好道路 后面还有类似老年代信息之类的 大家可以不用深入, 只需要关注最重要的倒数第五个值“FGC”这个就是我们最为关键的信息。他直接显示了你的程序发生了多少次full gc!! 也就是说,而我们解决jvm的问题就是从某种角度来解决full gc的频繁发生。当我们用jstat命令看到了短时间内发生了多次full gc这就证明了我们需要解决掉我们的JVM问题。
其实还有一些插接可以直接可视化的进行观察jvm内部问题,如jvisualvm,jprofiler。有兴趣的同学可以了解一下,这里我们只需要知道有这两个东西就行。
总结
回到标题的问题,我们可以用以下四点来回答这个问题
① 使用jmap来查看各个区域使用情况
② 使用jstack 命令来查看锁和线程的使用情况
③ 使用jstat命令来查看full gc发生的次数并以此来判断程序是否需要进行调优
④ 使用jvisualvm,jprofiler插件
此内容我已放入我的java面试题内,内有各种浓缩精华,本篇重点教大家如何深入记忆这个问题
java面试题:(10条消息) Java后端面试题(个人向)_zywlka的博客-CSDN博客
希望对诸君有帮助,有不善之处欢迎指出