GC调优基础知识之JDK为我们提供的工具:jps、jstat、jinfo、jmap、jhat、jstack
命令行工具名称 | 作用 |
---|---|
jps | 虚拟机进程状况工具 |
jstat | 虚拟机统计信息监视工具 |
jinfo | Java配置信息工具 |
jmap | Java内存映像工具 |
虚拟机堆转储快照分析工具 | |
jstack | Java堆栈跟踪工具 |
一、jps
jps是JDK 1.5提供的一个显示当前所有虚拟机进程pid的命令:
- -q :仅仅显示进程,
- -m:输出主函数传入的参数. 下的 hello 就是在执行程序时从命令行输入的参数
- -l: 输出应用程序主类完整 package 名称或 jar 完整名称.
- -v: 列出 jvm 参数, -Xms20m -Xmx50m 是启动程序指定的 jvm 参数
二、jstat
1、jstat是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据,在没有 GUI图形界面,只提供了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。常用形式:
jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]
常用参数:
- -class (类加载器)
- -compiler (JIT)
- -gc (GC 堆状态)
- -gccapacity (各区大小)
- -gccause (最近一次 GC 统计和原因)
- -gcnew (新区统计)
- -gcnewcapacity (新区大小)
- -gcold (老区统计)
- -gcoldcapacity (老区大小)
- -gcpermcapacity (永久区大小)
- -gcutil (GC 统计汇总)
- -printcompilation (HotSpot 编译统计)
2、eg:需要每 100 毫秒查询一次进程 13616 垃圾收集状况,一共查询 8 次,那命令应当是:jstat-gc 13616 100 8
;
eg:编译统计:jstat -compiler 19570
;
eg:堆内存统计:jstat -gccapacity 19570
;
三、jinfo
1、jinfo查看和修改虚拟机的参数。
- jinfo –sysprops 可以查看由 System.getProperties()取得的参数
- jinfo –flag 未被显式指定的参数的系统默认值
- jinfo –flags(注意 s)显示虚拟机的参数
2、eg:通过 jinfo 修改参数,打印 GC 详情:
四、jmap
1、jmap用于生成堆转储快照(一般称为 heapdump 或 dump 文件)。jmap 的作用并不仅仅是为了获取 dump 文件,它还可以查询 finalize 执行队列、Java 堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。
和 jinfo 命令一样,jmap 有不少功能在 Windows 平台下都是受限的,除了-dump和-histo 选项在所有操作系统都提供之外,其余选项都只能在 Linux/Solaris 下使用。
常用参数:
- heap : 显示Java堆详细信息
- histo : 显示堆中对象的统计信息
- permstat :Java堆内存的永久保存区域的类加载器的统计信息
- finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行 finalizer方法的对象
- dump : 生成堆转储快照
- F : 当-dump没有响应时,强制生成dump快
2、常用样例
eg1:jmap -heap [vmid]
打印heap的概要信息,GC使用的算法,heap的配置及使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况。
eg2:jmap -histo [vmid]
查看每个类的实例、空间占用统计
一般常用-》:jmap –histo 19064 | head -20(显示排名前20的记录)
一般常用-》存活对象空间占用统计:jmap -histo:live [vmid]
eg3:jmap -dump:live,format=b,file=dump.hprof [vmid]
dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名
-XX:-HeapDumpOnOutOfMemoryError 默认关闭,建议开启,在 java.lang.OutOfMemoryError 异常出现时,输出一个 dump 文件,记录当时的堆内存快照。
-XX:HeapDumpPath=./java_pid.hprof 用来设置堆内存快照的存储文件路径,默认是 java 进程启动位置。
五、jhat
jhat dump 文件名
后屏幕显示“Server is ready.”的提示后,用户在浏览器中键入 http://localhost:7000/就可以访问详情。
Sun JDK 提供 jhat(JVM Heap Analysis Tool)命令与 jmap 搭配使用,来分析 jmap 生成的堆转储快照。
使用 jhat 可以在服务器上生成堆转储文件分析(一般不推荐,毕竟占用服务器的资源。
六、jstack
jstack [vmid]
jstack用于生成虚拟机当前时刻的线程快照。
线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。
一般来说 jstack 主要是用来排查是否有死锁的情况