java常见面试考点
往期文章推荐:
java常见面试考点(二十八):内部类详解
java常见面试考点(二十九):进程和线程的区别
java常见面试考点(三十):异常
java常见面试考点(三十一):连接池的作用
java常见面试考点(三十二):诊断生产环境服务器变慢
【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权);
本博客的内容来自于:java常见面试考点(三十三):常用的JVM监控和性能分析工具;
学习、合作与交流联系q384660495;
本博客的内容仅供学习与参考,并非营利;
一、JVM 命令行工具
以下是较常用的 JDK 命令行工具:
名称 | 描述 |
---|---|
jps | JVM 进程状态工具。显示系统内的所有 JVM 进程。 |
jstat | JVM 统计监控工具。监控虚拟机运行时状态信息,它可以显示出 JVM 进程中的类装载、内存、GC、JIT 编译等运行数据。 |
jmap | JVM 堆内存分析工具。用于打印 JVM 进程对象直方图、类加载统计。并且可以生成堆转储快照(一般称为 heapdump 或 dump 文件)。 |
jstack | JVM 栈查看工具。用于打印 JVM 进程的线程和锁的情况。并且可以生成线程快照(一般称为 threaddump 或 javacore 文件)。 |
jhat | 用来分析 jmap 生成的 dump 文件。 |
jinfo | JVM 信息查看工具。用于实时查看和调整 JVM 进程参数。 |
jcmd | JVM 命令行调试 工具。用于向 JVM 进程发送调试命令。 |
二、jps
jps(JVM Process Status Tool) (opens new window)是虚拟机进程状态工具。它可以显示指定系统内所有的 HotSpot 虚拟机进程状态信息。jps 通过 RMI 协议查询开启了RMI 服务的远程虚拟机进程状态。
jps 命令用法
jps [option] [hostid]
jps [-help]
如果不指定 hostid 就默认为当前主机或服务器。
常用参数:
option - 选项参数
-m - 输出 JVM 启动时传递给 main() 的参数。
-l - 输出主类的全名,如果进程执行的是 jar 包,输出 jar 路径。
-v - 显示传递给 JVM 的参数。
-q - 仅输出本地 JVM 进程 ID。
-V - 仅输出本地 JVM 标识符。 hostid - RMI 注册表中注册的主机名。如果不指定 hostid 就默认为当前主机或服务器。 其中 option、hostid 参数也可以不写。
三、jstat
jstat(JVM statistics Monitoring) (opens new window),是虚拟机统计信息监视工具。jstat用于监视虚拟机运行时状态信息,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据
jstat 命令用法
jstat [option] VMID [interval] [count]
常用参数:
option - 选项参数,用于指定用户需要查询的虚拟机信息
-class - 监视类装载、卸载数量、总空间以及类装载所耗费的时间
-compiler:显示 JIT 编译的相关信息;
-gc:监视 Java 堆状况,包括 Eden 区、两个 survivor 区、老年代、永久代等区的容量、已用空间、GC 时间合计等信息。
-gccapacity:显示各个代的容量以及使用情况;
-gcmetacapacity:显示 Metaspace 的大小;
-gcnew:显示新生代信息;
-gcnewcapacity:显示新生代大小和使用情况;
-gcold:显示老年代和永久代的信息;
-gcoldcapacity:显示老年代的大小;
-gcutil:显示垃圾回收统计信息;
-gccause:显示垃圾回收的相关信息(通 -gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因;
-printcompilation:输出 JIT 编译的方法信息。 VMID - 如果是本地虚拟机进程,则 VMID 与 LVMID 是一致的;如果是远程虚拟机进程,那 VMID
的格式应当是:[protocol:][//]lvmid[@hostname[:port]/servername] interval -
查询间隔 count - 查询次数
更多可以参考jstat命令查看jvm的GC情况 (以Linux为例)
四、jmap
jmap(JVM Memory Map) (opens new window)是 Java 内存映像工具。jmap用于生成堆转储快照(一般称为 heapdump 或 dump 文件)。jmap 不仅能生成 dump 文件,还可以查询 finalize执行队列、Java 堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。
如果不使用这个命令,还可以使用 -XX:+HeapDumpOnOutOfMemoryError 参数来让虚拟机出现 OOM 的时候,自动生成dump 文件
jmap 命令用法
命令格式:
jmap [option] pid
option 选项参数:
-dump - 生成堆转储快照。-dump:live 只保存堆中的存活对象。
-finalizerinfo - 显示在 F-Queue 队列等待执行 finalizer 方法的对象
-heap - 显示 Java 堆详细信息。
-histo - 显示堆中对象的统计信息,包括类、实例数量、合计容量。-histo:live 只统计堆中的存活对象。
-permstat - to print permanent generation statistics
-F - 当-dump 没有响应时,强制生成 dump 快照
五、jstack
jstack(Stack Trace for java) (opens new window)是 Java 堆栈跟踪工具。jstack 用来打印目标 Java 进程中各个线程的栈轨迹,以及这些线程所持有的锁,并可以生成 java 虚拟机当前时刻的线程快照(一般称为 threaddump 或 javacore 文件)。
线程快照是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
jstack 命令用法:
jstack [option] pid
option 选项参数
-F - 当正常输出请求不被响应时,强制输出线程堆栈
-l - 除堆栈外,显示关于锁的附加信息
-m - 打印 java 和 jni 框架的所有栈信息
六、jinfo
jinfo(JVM Configuration info) (opens new window),是 Java 配置信息工具。jinfo用于实时查看和调整虚拟机运行参数。如传递给 Java 虚拟机的-X(即输出中的 jvm_args)、-XX参数(即输出中的 VM Flags),以及可在 Java 层面通过System.getProperty获取的-D参数(即输出中的 System Properties)
之前的 jps -v 口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用 jinfo 口令。
jinfo 命令格式:
jinfo [option] pid
option 选项参数:
-flag - 输出指定 args 参数的值
-sysprops - 输出系统属性,等同于 System.getProperties()
七、jhat
jhat(JVM Heap Analysis Tool),是虚拟机堆转储快照分析工具。jhat 与 jmap 搭配使用,用来分析 jmap 生成的 dump 文件。jhat 内置了一个微型的 HTTP/HTML 服务器,生成 dump 的分析结果后,可以在浏览器中查看。
注意:一般不会直接在服务器上进行分析,因为 jhat 是一个耗时并且耗费硬件资源的过程,一般把服务器生成的 dump 文件,用 jvisualvm 、Eclipse Memory Analyzer、IBM HeapAnalyzer 等工具来分析。
八、jcmd
查看正在运行的 Java 进程ID、名称和 main 函数参数
$ jcmd
7200 sun.tools.jcmd.JCmd
10614 com.install4j.runtime.launcher.MacLauncher
88348 org.gradle.launcher.daemon.bootstrap.GradleDaemon 2.14
注意,7200 进程是jcmd本身。执行完jcmd后,该进程已经结束了。
查看某个进程支持的命令:在jcmd 后加上进程 ID,然后加上 help 。
$ jcmd 10614 help
查看 JVM 进程信息
$ jcmd 10614 VM.info
建议进程进行垃圾回收
$ jcmd 10614 GC.run
更多用法可以参考:Java : jcmd 命令的使用
九、jconsole
查看虚拟机的使用情况,是GUI界面,不多做介绍
jconsole
十、jvisualvm
jconsole的升级版
jvisualvm