GC日志
打开GC日志1
-server -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:./logs/gc.log
jmap
生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。
命令
1、jmap -histo[:live]
通过histo选项,打印当前java堆中各个对象的数量、大小。
如果添加了live,只会打印活跃的对象。
2、jmap -dump:[live,]format=b,file=
通过-dump选项,把java堆中的对象dump到本地文件,然后使用MAT进行分析。
如果添加了live,只会dump活跃的对象。
jmap -histo 19470 | jmap -histo:live 19470
3、jmap -heap
通过-heap选项,打印java堆的配置情况和使用情况,还有使用的GC算法。
jmap -heap 19470
4、jmap -finalizerinfo
通过-finalizerinfo选项,打印那些正在等待执行finalize方法的对象。
5、jmap -permstat
通过-permstat选项,打印java堆永久代的信息,包括class loader相关的信息,和interned Strings的信息。`
实现原理
通过jmap和jvm之间进行通信,有两种实现方式:attach 和 SA。
attach
attach方式,简单来说就是客户端和服务端之间的通信,客户端发送请求,主要逻辑在服务端执行,jmap相当于客户端,JVM相当于服务端。
在JVM中,有一个叫”Attach Listener”的线程,专门负责监听attach的请求,并执行对应的操作。
客户端连接到目标JVM,向其发出一个类似“inspectheap”命令
目标JVM接收到命令,执行JVM内相关函数,将收集到的结果以文本形式返回
客户端接收到返回的文本并将其显示出来;
SA
假如执行”jmap -heap 5409″,就不会使用attach方式实现了。
在参数解析中,如果参数是”-heap|-heap:format=b|-permstat|-finalizerinfo”中的一种,或者添加了”-F”,比如”jmap -histo -F 5409″,则使用SA的方式。
SA方式,和attach方式不同的是,相关的主要逻辑都在SA中实现,从JVM中获取数据即可。
jps
只列出系统中所有的 Java 应用程序。
-q:只输出进程 ID
-m:输出传入 main 方法的参数
-l:输出完全的包名,应用主类名,jar的完全路径名
-v:输出jvm参数
-V:输出通过flag文件传递到JVM中的参数
jinfo
可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息。
jinfo 19470
输出当前 jvm 进程的全部参数和系统属性
参数说明
pid 对应jvm的进程id
executable core 产生core dump文件
[server-id@]remote server IP or hostname 远程的ip或者hostname,server-id标记服务的唯一性id
option
no option 输出全部的参数和系统属性
-flag name 输出对应名称的参数
-flag [+|-]name 开启或者关闭对应名称的参数
-flag name=value 设定对应名称的参数
-flags 输出全部的参数
-sysprops 输出系统属性
jstack
进程所包含线程情况查询 (位于”jdk_home/bin”目录下),可以实时监测系统资源占用与jvm运行情况。
jstack 19470
查看当前java进程的堆栈状态
参数说明:
-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent 的 ownable synchronizers列表.
-F 当’jstack [-l] pid’没有相应的时候强制打印栈信息
-m 打印java和native c/c++框架的所有栈信息.
-h | -help 打印帮助信息
pid 需要被打印配置信息的java进程id,可以用jps查询.
jstat
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:
jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]
// 命令语法结构:
Usage: jstat -help|-options
jstat -
S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
//示例
jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation
jstat -class -t 19470
Timestamp Loaded Bytes Unloaded Bytes Time
6188.4 3898 7178.4 40 58.3 1.78
jstat -gcutil 19470 1000 5
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 25.00 98.55 15.37 96.94 94.88 21 0.069 7 0.237 0.306
0.00 25.00 99.59 15.37 96.94 94.88 21 0.069 7 0.237 0.306
0.00 25.00 99.59 15.37 96.94 94.88 21 0.069 7 0.237 0.306
0.00 25.00 100.00 15.37 96.94 94.88 21 0.069 7 0.237 0.306