实战
1、查看JVM版本
java -version
2、通过-D设置系统属性参数
//编译
javac TestJVM.java
//测试
java TestJVM
//添加运行参数
java -Dstr=123 TestJVM
3、-server与-client参数
server默认的初始堆空间大一些,默认并行垃圾回收器,启动慢,运行快
//用clinet启动
java -client -showversion TestJVM
//server
java -server -showversion TestJVM
## 64位系统就不支持client模式了
4、-Xms与-Xmx参数
- -Xms与-Xmx分别是设置jvm的堆内存的初始大小和最大大小。
- -Xmx2048m:等价于-XX:MaxHeapSize,设置JVM最大堆内存为2048M。
- -Xms512m:等价于-XX:InitialHeapSize,设置JVM初始堆内存为512M。
java -Xms512m -Xmx2048m TestJVM
5、查看JVM运行参数
分两种情况
- 运行java命令时打印出运行参数;
- 查看正在运行的java进程的参数;
1、启动运行时,启动-XX:+PrintFlagsFinal,即可打印参数
java -XX:+PrintFlagsFinal -version
注意:参数有boolean类型和数字类型,值的操作符是=或:=,分别代表默认值和被修改的值。
2、查看正在运行的JVM参数
# 查看所有的参数,用法:jinfo -flags <进程id>
例:jinfo -flags 1136
# 通过jps 或者 jps -l 查看java进程
例:jps
例:jps -l
# 查看某一参数的值,jinfo -flag <参数名> <进程id>
例:jinfo -flag MaxHeapSize 6219
6、jstat命令进行查看堆内存使用情况
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。
jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]
6.1、查看class加载统计
jstate -class 6219
说明:
- Loaded:加载class的数量
- Bytes:所占用空间大小
- Unloaded:未加载数量
- Bytes:未加载占用空间
6.2、查看编译统计
jstat -compiler 6219
说明:
- Compiled:编译数量。
- Failed:失败数量
- Invalid:不可用数量
- Time:时间
- FailedType:失败类型
- FailedMethod:失败的方法
6.3、垃圾回收统计
jstat -gc 6219
7、jmap命令查看内存使用情况
7.1、查看内存使用情况
jmap -heap 6219
7.2、查看内存中对象数量及大小
#查看所有对象,包括活跃以及非活跃的
jmap -histo <pid> | more
#查看活跃对象
jmap -histo:live <pid> | more
例:jmap -histo:live 6219 | more
7.3、将内存使用情况dump到文件中
tip:有些时候我们需要将jvm当前内存中的情况dump到文件中,然后对它进行分析,jmap也是支持dump到文件中的
#用法:
jmap -dump:format=b,file=dumpFileName <pid>
#示例
jmap -dump:format=b,file=/tmp/dump.dat 6219
7.4、通过jhat对dump文件进行分析
#用法:
jhat -port <port> <file>
#示例:
jhat -port 9999 /tmp/dump.dat
打开浏览器进行访问:http://ip:9999/
8、通过MAT工具对dump文件进行分析
MAT介绍:
MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象
下载地址:https://www.eclipse.org/mat/downloads.php
官网地址:https://www.eclipse.org/mat/
使用
9、jstack命令的使用(CPU负载突然增高,出现思索,死循环)
有些时候我们需要查看下jvm中的线程执行情况,比如,发现服务器的CPU的负载突然增高了、出现了死锁、死循环等,我们该如何分析呢?
由于程序是正常运行的,没有任何的输出,从日志方面也看不出什么问题,所以就需要看下jvm的内部线程的执行情况,然后再进行分析查找出原因
#用法:jstack <pid>
10、VisualVM工具的使用
VisualVM,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。
VisualVM使用简单,几乎0配置,功能还是比较丰富的,几乎囊括了其它JDK自带命令的所有功能。
10.1启动
在jdk的安装目录的bin目录下,找到jvisualvm.exe,双击打开即可。
10.2、查看本地进程
10.3、查看CPU、内存、类、线程运行信息
10.4、查看线程详情
10.5、抽样器
10.6、监控远程的jvm
VisualJVM不仅是可以监控本地jvm进程,还可以监控远程的jvm进程,需要借助于JMX技术实现。
tip:什么是JMX?
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。
JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
a、指令监控远程tomcat
想要监控远程的tomcat,就需要在远程的tomcat进行对JMX配置,方法如下:
#在tomcat的bin目录下,修改catalina.sh,添加如下的参数
JAVA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false"
参数意思是:
b、 使用VisualJVM连接远程tomcat