生产环境调优2 (内存溢和死循环,死锁);通过JVisualVM监控本地和远程
1.4Jmap+MAT实战内存溢出
start.spring.io快速建立一个工程
制造两个内存溢出 一个堆的一个非堆的
While(true){
List.add(new user)
}
List<Class> 创建很多个 class
While(true){
List.add(class)
}
1.5如何导出内存映像文件
c和java相反的 一个是指针丢了 一个是指针一直不释放
- 内存溢出自动导出
-xx:+HeapDumpOnOutOfMemoryError
-xx:HeapDumpPath=./
2.使用jmap 命令手动导出
Cmd下面 cd Desktop
下载地址https://www.eclipse.org/mat/downloads.php
jmap -dump:format=b,file=heap.hprof pid
//写在本地idea中参数
-Xmx32M -Xms32M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./
然后用分析软件打开看就行
Jmap -heap 16940
1.6Jstack实战死循环和死锁
如果cpu飙高可能是出现 死循环和死锁问题
Jstack pid >xxx.txt
sz 下载
top -p pid -H
转成10进制: printf “%x” 8247 2037
//错误格式的 在文件里找2037
死循环问题 多个请求时候都会卡在一个方法,
死锁问题 可以直接拉到 jstack 最后会有分析结果
死循环分析:
Jstack pid >xxx.txt 查看这个 txt
Top -p pid H 展示运行的线程 找
Printf “%x” 8247 16进制
然后 去txt文件里找
死锁分析:
Jstack pid >xxx.txt 查看这个txt
直接到文件最末尾
2.1基于JVisualVM的可视化监控
1主要内从
监控tomcat 本地和远程.
也可以做内存溢出或者死锁cpu高的分析
监控java进程
安装插件地址
https://visualvm.github.io/pluginscenters.html
本地jdk 下的工具
- 远程连接的话 修改Catalina.sh
就是通过操作JVisualVM里的各种图形化页面,操作查看问题,可以dump 堆 cpu 等看到现在存在的问题