## 常见jvm分析工具主要是为了查错和进行调优
## 一、CLI
1、jps(java process status)
jsp:
-p 只显示pid 不显示class 名称,jar文件名和传递给main方法的参数
-m 只显示输出main方法的参数 在嵌入式jvm上可能是null
-l 输出应用程序main class的完整package名或者应用程序的jar文件完整路径名
-v 输出传递给jvm的参数
jps host 查看host的jps的情况 前提host提供jstatd服务
2、jstatd(了解·)
启动jvm监控服务他是一个基于rmi(远程接口调用)的应用,向远程机器提供本机jvm应用程序的信息,默认端口1099 -p指定端口
实例:jstatd -J-Djava.security.policy=my.policy &
my.policy文件需要自己建立,内如如下:
grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission; };
这是安全策略文件,因为jdk对jvm做了jaas(Java验证和授权API)的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作;
3.jmap
观察运行中的jvm物理内存的占用情况
jmap:
pid 进程号
常用参数
-heap:打印jvm heap(堆)的情况(垃圾收集器类型)
-histo:打印jvm heap的直方图 其输出信息包括类名,对象数量,对象占用大小
histo:live 同上但是只打印存活对象的情况
-permstat:打印permanent generation heap(方法区)情况(在jdk1.8之后不存在方法区)
-finalizerinfo:打印正等候回收的对象信息
```
[bigdata@bigdata01 jvm]$ jmap -heap 8580
Attaching to process ID 8580, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.112-b15
using thread-local object allocation.
Parallel GC with 4 thread(s)
-Xms:500m -Xmx:1000m 500M <= 堆空间 <= 1000m
Heap Configuration:
MinHeapFreeRatio = 0 ---->堆最小的空闲比例,此时堆的空间大小是多少:也就是说堆空间被占满,显然就是1000m
MaxHeapFreeRatio = 100 ---->堆最大的空闲比例,此时堆的空间大小是多少? 也就是说堆空间使用最小内存,显然就是500m
MaxHeapSize = 1048576000 (1000.0MB) 堆的最大空间大小
NewSize = 21495808 (20.5MB) 新生代初始化空间大小
MaxNewSize = 349175808 (333.0MB) 新生代最大空间大小
OldSize = 43515904 (41.5MB) 老年代的初始化空间大小
NewRatio = 2 老年代和新生代的内存空间比例=2:1,加入调整为3-->-XX:NewRatio=3
SurvivorRatio = 8 Eden区和survivor空间比例:8:1:1
MetaspaceSize = 21807104 (20.796875MB) jdk1.8之后叫做元数据区,就是jdk1.8以前的PermSize, 初始化空间大小
CompressedClassSpaceSize = 1073741824 (1024.0MB) 压缩的类的空间大小
MaxMetaspaceSize = 17592186044415 MB 对应的最大空间大小
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation 新生代
Eden Space:
capacity = 73400320 (70.0MB) 容量
used = 11939112 (11.386024475097656MB) 已用大小
free = 61461208 (58.613975524902344MB) 空闲大小
16.26574925013951% used
From Space:
capacity = 4194304 (4.0MB)
used = 131072 (0.125MB)
free = 4063232 (3.875MB)
3.125% used
To Space:
capacity = 6815744 (6.5MB)
used = 0 (0.0MB)
free = 6815744 (6.5MB)
0.0% used
PS Old Generation 老年代
capacity = 76546048 (73.0MB)
used = 51528752 (49.14164733886719MB)
free = 25017296 (23.858352661132812MB)
67.31732512173588% used
16790 interned Strings occupying 1695440 bytes.
```
用jmap 把进程内存使用情况dump(相当于导入)到文件中,在用jhat分析查看,jmap进行dump命令格式如下
jmap -dump:fromat=b,file=dempFileNmae pid
jmap -dump:fromat=b,file=4574.heap20151215 4574
Dumping heap to 4574.heap20151215 4574
Heap dump file created
dump出来的文件可以用MAT、VisualVM等工具查看,这里用jhat查看:
jhat -port 9998 /tmp/dump.dat
注意如果Dump文件太大,可能需要加上-J-Xmx512m这种参数指定最大堆内存,即jhat -J-Xmx512m -port 9998 /tmp/dump.dat。然后就可以在浏览器中输入主机地址:9998查看了。
注意:-J-Xmx512m中间没有空格。
4、jinfo(了解)
Configuration info
官方地址http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jinfo.html
jinfo [option] pid
pid 进程号
参数如下:
no option:打印命令行参数和系统属性
-flags 打印命令行参数
-sysprops 打印系统属性
- h 帮助
-我们经常通过-D来给jvm传递自定义的系统参数
后台通过System.properties来获取这个参数,进而进行下一步的操作:
5、jstack
jstack :stack trace
http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstack.html
jstack 能得到运行java程序的java stack(java堆栈)和native stack(本地堆栈)的信息,可以轻松得知当前线程的运行情况
jstack[option] pid
参数如下
-l 长列表,打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表
-m 打印java和native c/c++框架的所有信息
tid指java Thread id。nid指native线程的id。prio是线程的优先级[0x00007fd4f8684000]是线程栈起始地址
dump 文件里 值得关注线程有:
死锁,Deadlock(重点关注)
等待资源,Waiting on condition(重点关注)
等待获取监视器,Waiting on monitor entry(重点关注)
阻塞,Blocked(重点关注)
执行中,Runnable
暂停,Suspended
对象等待中,Object.wait() 或 TIMED_WAITING
停止,Parked
6、jstat
jstatd:java virtual Machine statistics Monitoring Tool
http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html
Usage:jstat -help|-options
jstat -
参数解释:
Options -选项,我们一般使用-gcutil /-gc查看gc情况
pid -VM的进程号,即当前运行的java进程号
interval[s|ms] --间隔时间,单位为秒或者毫秒,默认为ms。必须为正整型
count - 打印次数 如果缺省打印无数次
例如例如:jstat -gc 4645 500 10 表示查看进程号为4645的gc 每500ms打印一次 共打印10次
jstat -gc 8580 100ms 10
参数说明
S0C --->survivor-0 capacity
S1C --->survivor-1 capacity
S0U --->survivor-0 used
S1U --->survivor-1 used
EC --->eden capacity
EU --->eden used
OC --->old generation capacity
OU --->old generation used
MC --->metaspace capacity/jdk1.8以前叫PC
MU --->metaspace used/jdk1.8以前叫PU
CCSC --->compressed class space capacity
CCSU --->compressed class space used
YGC --->截止到目前为止总共执行了多少次ygc(minor gc)
YGCT --->截止到目前为止总共执行ygc消耗的时间(单位秒)
FGC --->截止到目前为止总共执行了多少次fullgc(minor gc)
FGCT --->截止到目前为止总共执行fullgc消耗的时间(单位秒)
GCT --->截止到目前为止所有gc消耗的时间(单位秒)
## 二、GUI
1、jconsole 可视化的jvm监控软件
可以监控本地或者远程进程
主要包括:概括、内存、线程、类、Vm概要、Mbean选项卡
概括选项卡:呈现四副图表:主要包括堆内存使用量、类、线程、cpu占有率
内存选项卡:包括堆内存、非堆内存、内存池的使用量图表和详细信息。、相当于jstat命令
线程选项卡:显示所有的线程的信息图表、相当于jstack命令
类选项卡:加载类的信息
Vm概要:Vm的概要信息包括堆大小、垃圾收集信息、Vm参数等
Mbean选项:managed beans 被管理的beans
2、jvisualvm,
多合一的故障处理工具
visual vm是迄今为止,jdk发布的功能最强大的运行监视和故障处理程序。可以查看本都和远程的状态
优点:不需要被监控的程序基于特殊的Agent运型,因此他对应用程序的实际影响很小,这样他可以直接运行在生产环境中,这是其他监视工具比如:jprofile、yourkit无法与之相比的
visualvm.exe
主要特点:
1、插件安装。
2、生成、浏览堆转储快照和线程快照。
3、抽样器和profiler中分析程序性能。
4、BTrace插件动态日志跟踪。
# 三、 常见jvm调优参数总结
Java1.7的jvm参数查看一下官方网站。
http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html
Java1.8
http://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html
Hotspotvm知识查看一下官方网站。
http://www.oracle.com/technetwork/java/javase/tech/index-jsp-136373.html
主要的参数是:堆的大小、栈的大小、新生代和老年代的比值、新生代中eden和s0、s1的比值。
**-Xms:初始堆大小**,默认是物理内存的1/64。默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到--Xmx的最大限制。例如:-Xms 20m。
**-Xmx:最大堆大小**。默认是物理内存的1/4 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。
-**XX:NewSize=n**:设置年轻代大小(初始值)。
**-XX:MaxNewSize**:设置年轻代最大值。
**-XX:NewRatio=n:**设置年轻代和年老代的比值。
**-XX:SurvivorRatio=n**:年轻代中Eden区与两个Survivor区的比值。
**-XX:PermSize**(1.8之后改为MetaspaceSize) 设置持久代(perm gen)初始值,默认是物理内存的1/64。
**-XX:MaxPermSize=n**:(1.8之后改为MaxMetaspaceSize)设置最大持久代大小。
**-Xss**:每个线程的堆栈大小。
面试的时候如何阐述jvm,gc
运行时区域--->gc(堆)--->不被引用的对象(引用?)--->判断对象是否被引用--->可达性分析(两次标记)---->gc使用方式(gc的算法)--->minor gc 或者major gc。
常见的优化参数:
-Xms
-Xmx
-XX:NewSize...
垃圾收集器
CMS、Serial、ParNew
常见的分析工具
jsp
jmap
jstack
jconsole