1、模拟环境搭建
1.1 tomcat下载与搭建
下载地址:https://tomcat.apache.org/download-90.cgi
1.2 解压安装
cd /data/jvmpretest # 解压 tar -zxvf apache-tomcat-9.0.73.tar.gz
1.3Jvmpertest.war 丢到webapps文件夹下
修改堆栈信息,让其很快抛出异常:
catalina.sh `JAVA_OPTS="-Xms256m -Xmx256m -Xmn128m"`
启动tomcat
1.4jmeter调用
jmeter调用: http://ip:8080/JvmPertest/pertest1
设置性能场景进行调用,报错
2.oom现象
确定oom问题现象:
- 响应信息:看请求的响应信息,如上图, 一般的情况下,出现内存溢出问题,在响应信息中都会有所体现`nested exception is java.lang.OutOfMemoryError: Java heap space`
- 项目日志:有些项目,在log日志中,会有体现,但也不一定有
- 系统内存:我们看 系统的 内存,发现内存并没有被完全消耗掉,因为只是占用了分配的内存大小,free没减少多少,但是内存本来是2.5,压测停止后内存是2.2,之后一直没有释放,这种就要想到内存泄漏,从而导致内存溢出
- 这个问题,网络通,比一定会死,服务也不一定会停,进程一直可能都在,但是也有可能运行命令./stop也不一定可以把进程停止,直到用kill -9 强制停止
系统内存并没有减少多少,只是占用了分配的内存大小,但是接口运行结束后,一直没释放内存,就会导致内存泄漏,从而内存溢出
3.oom分析-jmap
命令:imap[options] pid
- -dump:生成java堆栈的快照信息
- -heap:显示java堆详细信息,使用哪种回收机制、参数配置、分代情况
- -histo:显示堆中对象统计信息,包括类、实例数量
- jmap -F -dump:format=b,file=文件名bin 进程id ===执行时间比较长,需要等待结束jmap -F -dump:live,format=bfile=jvmpertest110901.bin 3636
定位这个问题步骤:
- 1、生成内存溢出堆栈文件
获得进程id `ps -ef |grep java` `jps` `jmap -dump:live,format=b,file=heap_jvmpertest_20210811002.hprof 2419`
或者方法2:arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar
启动: `java -jar arthas-boot.jar pid`
`heapdump` ,在出现内存溢出的错误是,执行这个命令,可以直接下载heapdump信息
heapdump-出现
- 2、解析堆栈文件-MAT
解压MemoryAnalyer工具
打开工具,open hprof文件
点击 histogram
没有java基础的同学, hprof文件给开发去定位, 有基础的同学,mat工具自己来分析
标签:场景,java,dump,oom,内存,arthas,jmap,模拟 From: https://www.cnblogs.com/shishibuwan/p/17178267.html