服务器部署方式为tomcat中运行war包的方式, 有一次重新部署时候发现报异常堆栈溢出了.
想要定位到某个war包中通过学习整理出此篇文章以作记录笔记.
1. 关于内存过高的情况
不要看到free
很少就很慌或者used
很高, 就以为内存爆了. 其实不是, 是因为Linux内存管理技术 -- 虚拟内存
参考2: tomcat内存占用过高_jvm疯狂吞占内存,罪魁祸首是谁?
2. 顺便检查储存空间是否足够
如果存储数据或缓存的分区过大, 可以给分区扩容或清理缓存的方法.
/dev/vda[数字]过大情况下可参考一下连接:
3. 内存堆栈信息 - jar(导出堆栈方式)
通过jps
指令查看系统中运行的项目
如果还有tomcat运行包, 会多一条[pid] Bootstrap
数据
(服务器测试时没有jar包的名称, 可能Bootstrap名称也会不同)
使用jmap -dump:format=b,file=wanfile.dump 21445
导出堆栈文件, 并且下载到本地.
使用jvisualvm.exe
打开, 与java.exe
和javac.exe
都在同目录%JSAVA_HOME/bin%
下
点击显示系统属性
, 可以查看到当前的jar包运行的参数, 包括当前jar包的名称.
之后我也将Bootstrap
也下载了下来
类
: 可以查看堆栈中的类信息, 主要查看自己定义的类的实例数和ArrayList
是否过高
注: java11包括java11之后的版本不再提供jvisualvm.exe
, 有需要的话可以在VisualVM: Download 下载.
参考2: jvisualvm.exe使用介绍
memory analyzer
软件工具分析堆栈文件
如果常用jdk(系统变量path中配置的)是java8的话, 由于此工具要求jdk版本是java11+, 所以需要手动配置java11, 在MemoryAnalyzer.exe
同目录下的MemoryAnalyzer.ini
配置文件中最前面添加-vm path
:
-vm
C:\Program\Java\java-11\bin\javaw.exe
-startup
plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.2.400.v20211117-0650
-vmargs
-Xmx1024m
参考1: 官网下载地址
参考3: Memory Analyzer基本使用
参考4: 一文让你理解什么是shallow heap及retained heap
4. 内存堆栈信息 - jar(在线监控)
只需要使用java
指令启动时候添加5中那些-D
参数即可
5. 内存堆栈信息 - tomcat
tomcat中的各个war的运行情况暂时无法分开查看
-
目标
tomcat
的bin
目录下的catalina.sh
文件内添加# 1.之前是写到一行, 但是启动有问题, 后面拆开多行成功 # 2.hostname填写ip或者域名 # 3.port使用的是与tomcat或docker相同的端口(尝试使用不同的未能成功, 于参考4中发现) # 4.authenticate代表是否需要鉴权 CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote=true" CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=[ip or servername]" CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=80" CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false" CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
-
打开软件
visualvm
, 右键打开Add Remote Host...
-
输入
hostname
, 目标服务器的ip或域名, 点击OK
-
右键新添加的远程主机, 点击
Add JMX Connection...
-
填写上接口, 同服务器配置中的
port
-
如果配置上
jmxremote.authenticate=true
, 需要填写上配置的用户名和密码 -
勾选上不需要SSL连接, 同配置中的
jmxremote.ssl=false
-
点击
OK
后其下会出现下图所示 -
双击上图箭头所指位置, 右侧窗口中可看到具体内容
-
-
visualvm
功能可在官网上的Features
和Documentation
进行查阅.参考1: jvisualvm.exe使用
参考2: VisualVM详解
参考3: jvisualvm 监控 tomcat 实例(qbit)
参考4: Has anyone ever got a remote JMX JConsole to work?
参考5: jvisualvm之jmx远程连接