JVM内存分析
2020-02-14 本文已影响0人
Suny____
JVM常用命令
- jps 查看所有的java进程ID
-
jinfo 实时查看和调整JVM配置参数
- 查看
- jinfo -flag <name> <PID> 查看某个java进程的name属性的值
- jinfo -flag MaxHeapSize PID
- jinfo -flag UseG1GC PID
- 修改
- 参数只有被标记为manageable的flags可以被实时修改
- jinfo -flag [+|-] PID
- jinfo -flag <name>=<value> PID
- 查看曾经赋过值的一些参数
- jinfo -flags PID
- 查看
-
jstat 查看虚拟机性能统计信息
- 查看类装载信息
- jstat -class PID 1000 10 查看某个java进程的类装载信息,每1000毫秒输出一次,共输出10
次
- jstat -class PID 1000 10 查看某个java进程的类装载信息,每1000毫秒输出一次,共输出10
- 查看垃圾收集信息
- jstat -gc PID 1000 10
- 查看类装载信息
-
jstack 查看线程堆栈信息
- jstack PID 可以通过该命令排查线程的执行状态、死锁等
-
jmap 可以生成堆转储快照和打印出堆内存相关信息
- 打印出堆内存相关信息
- -XX:+PrintFlagsFinal -Xms300M -Xmx300M
- jmap -heap PID
- 可以看到堆内存中老年代新生代的内存分配情况
- dump出堆内存相关信息
- jmap -dump:format=b,file=<heap.hprof> PID 文件名自定义,后缀名固定
- 堆内存溢出的时候自动dump
- -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
- 打印出堆内存相关信息
JVM常用工具
-
jconsole
- JConsole工具是JDK自带的可视化监控工具。查看java应用程序的运行概况、监控堆信息、永久区使用情况、类加载情况等。
- 命令行中输入:jconsole
-
jvisualvm
- 可以监控本地、远程的java进程的CPU,类,线程等
- 监控远端Java进程
- 在visualvm中选中“远程”,右击“添加”
- 主机名上写服务器的ip地址,比如111.11.11.111,然后点击“确定”
- 右击该主机“111.11.11.111”,添加“JMX”[也就是通过JMX技术具体监控远端服务器哪个Java进程]
- 要想让服务器上的tomcat被连接,需要改一下 bin/catalina.sh 这个文件
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=<111.11.11.111> -Dcom.sun.management.jmxremote.port=<8998> -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.access.file=<../conf/jmxremote>.access -Dcom.sun.management.jmxremote.password.file=<../conf/jmxremote>.password"
- 在 ../conf 文件中添加两个文件jmxremote.access和jmxremote.password
jmxremote.access 文件 设置权限 guest readonly manager readwrite jmxremote.password 文件 设置账号密码 guest guest manager manager 授予权限 : chmod 600 *jmxremot*
- 将公网ip地址映射为服务器本地ip
vim /etc/hosts 192.168.1.177 111.11.11.111
- 设置上述端口对应的阿里云安全策略和Linux防火墙策略
- 启动tomcat
- jvisualvm连接
-
Arthas
- Arthas 是Alibaba开源的Java诊断工具,采用命令行交互模式,是排查jvm相关问题的利器
- 常用命令
version:查看arthas版本号 help:查看命名帮助信息 cls:清空屏幕 session:查看当前会话信息 quit:退出arthas客户端 --- dashboard:当前进程的实时数据面板 thread:当前JVM的线程堆栈信息 jvm:查看当前JVM的信息 sysprop:查看JVM的系统属性 --- sc:查看JVM已经加载的类信息 dump:dump已经加载类的byte code到特定目录 jad:反编译指定已加载类的源码 --- monitor:方法执行监控 watch:方法执行数据观测 trace:方法内部调用路径,并输出方法路径上的每个节点上耗时 stack:输出当前方法被调用的调用路径
-
MemoryAnalyzer
- Java堆分析器,用于查找内存泄漏
- Heap Dump,称为堆转储文件,是Java进程在某个时间内的快照
- 获取Dump文件
- 手动 jmap -dump:format=b,file=heap.hprof PID
- 自动 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
- 使用
- Histogram 可以列出内存中的对象,对象的个数及其大小
- Class Name:类名称,java类名
- Objects:类的对象的数量,这个对象被创建了多少个
- Shallow Heap:一个对象内存的消耗大小,不包含对其他对象的引用
- Retained Heap:是shallow Heap的总和,即该对象被GC之后所能回收到内存的总和
- 右击类名--->List Objects--->with incoming references--->列出该类的实例
- 右击Java对象名--->Merge Shortest Paths to GC Roots--->exclude all --->找到GC Root以及原因
- Leak Suspects 查找并分析内存泄漏的可能原因
- Reports--->Leak Suspects--->Details
- Top Consumers 列出大对象
- Histogram 可以列出内存中的对象,对象的个数及其大小
-
GC日志分析工具
- 要想分析日志的信息,得先拿到GC日志文件才行,所以得先配置一下
- -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:gc.log
- 在线
- 本地
- GCView
- Summay--->Throughput 吞吐量
- pause---> 停顿时间
- Event Details中查看GC次数 total
- GCView