JVM02_堆内存常见问题、定位 jmap、mat(16)
发现问题
举例子:
把网盘里的test1.war包放到tomcat的webapps下 启动tomcat 访问:http://192.168.1.104:8080/test1/init1.jsp
/opt/apache-tomcat-8.5.41/conf/server.xml 这个位置配置项目路径,不是所有公司都是默认路径为了安全都不会使用默认路径,要写绝对路径。
查看一下进程号、看看进程是不是存在:
查看端口号:/opt/apache-tomcat-8.5.41/conf/server.xml 这里查看8080
jmeter进行压测—看结果
内存溢出:
1、访问的时候页面转圈,等待要不没法过去 、要不然没返回结果
![](https://img2018.cnblogs.com/blog/1445954/201906/1445954-20190605153001324-1095080475.png)
2、fgc频繁回收和回收的时间需要关注—fgc很频繁每次如果时间很长,回收的时候应用就停止了。优化:要减少fgc频繁回收,回收的时间要缩减很短
3、ygc频繁回收和回收的时间需要关注—ygc很频繁每次如果时间很长、如果ygc每次回收1s时间过长也需要考虑。
————————————————————————————————————————————————————————————————————————————
内存溢出定位
jmap命令
jmap动态文件的大小
NUM——001
介绍jmap -histo pid ——由于文件较大要重定向
jmap -histo 3737 >histo.txt
vi histo.txt
分析文件—instances被引用多少次在堆调用多次 ,bytes占用了堆内存的大小从大到小排序,classname 类名
谁占用堆内存大就分析谁是否造成内存溢出的原因
可以看出cn.test.TestBean 占用空间比较大,这个是应用程序里的包名找到TestBean.class类里的方法使用后没有被释放。
用 jmap -histo pid 把堆内存占用的大小打印出来,看前20个有没有自己应用程序调用的类或者自己应用程序的方法,看包名:一般都是公司名加上项目名
top前20哪些className占用比较大,看看代码里的类
/opt/apache-tomcat-8.5.41/webapps/test1
vi init1.jsp
—————————————————————————————————————————————————————————————————————————————————
分析:
如果前20没有明显的自己公司的package类和方法,可能显示就是object,这时分析需要mat工具
mat工具分析内存溢出—一定要配置同版本的jdk
mat—分析object对象是谁产生的,mat是eclipsec里的一个插件
1、先去把堆文件下载下来进行分析
jmap -dump:live,format=b,file=heap.bin <pid>
用命令解析此文件 jhat heap.bin
查看—浏览器访问 ip+7000
如有报错内存不足--------把内存分配大一些 jhat -J-mx1024m heap.bin
使用 mat 工具
前提条件:内存溢出,看default_report,还有jmap分析不出来用mat工具
页面里显示大对象的详情,把引用关系列出来本例子里是a对象比较大所有有一个分析,如果a,b都占用40%就两个实例
把heap.bin 下载到本地
用工具打开heap.bin
mat自动生成报告
生成两个对象:a、b total是总计占用内存空间
第一个大对象
看Details详情—
看堆的活动情况和使用比率 ygc和fgc使用频率 jstat 命令
每隔2000毫秒打印5次
s0:存活区 s1:存活区E:eden 占eden区的比率,eden区有17%已被占用区O:老年代M:
CCS:YGC执行多少次:YGCT:ygc耗时FGC:FGCT:fgc的耗时 GCT:ygc+fgc所有时间之和
总结:
jmap -histo //定位内存泄漏原因
jmap -dump //分析内存溢出,jmap分析不出来,dump下来用mat工具分析
注:jmap -dump 一次就是执行一次fgc同时也ygc。
————————————————————————————————————————————————————————————————————————————————