启动springboot项目后RES和SHR内存都占到3G以上,其实项目很少的代码,然后需要排查一下什么原因,以前面试才经常准备调休和查问题,这次实践还是有点凌乱。
像网上说用命令jstack 查看线程什么的,我是看了,看了一大堆内容没看到有什么有用的信息,后面改成用jmap命令,有个命令jmap -heap ,输了之后发现没反应,后面才看到JDK17已经没有这个命令了,尴尬。然后使用jmap -help看看有哪些命令
然后来吧,先找到你的java线程ps -ef | grep 项目名 找到PID
然后jmap -histo:live PID 就可以看到占用内存的对象,示例:
这里看到项目中的代码排到最下面了,其实没有很占内存,实际占内存是Byte[]数组和反射,按理说就算有些包加载也不应该去到3G的
那就dump文件下来看看了,命令:jmap -dump:live,file=/dump.data PID
结果发现直接打开也没办法看出什么,还是要用工具去分析,找了一轮,用jvisualvm吧,听说JDK自带有,结果尴尬的发现又没有了,移除了,网上下载了一个最新版本,导入后看到内容了
和上面看到差不多,第一和第二是Byte[]和反射,然后发现其中确实有些问题的,有些文件流内容比较多,想着是不是文件流没关,查看代码确实有存在
后面重新启动后发现还是高,然后网上找到一个方案,说是启动的时候指定堆大小,-Xmx1024m -Xms512m,加完之后,再top查看内存降下来
jvisualvm这个用具真的一点不好用,我想着是不是有更好的工具,听说阿里的arthas很好用,改天试试