From b579d930b262c555a2750f947b16349d442fe53a Mon Sep 17 00:00:00 2001 From: asahi Date: Wed, 17 Dec 2025 15:49:19 +0800 Subject: [PATCH] =?UTF-8?q?doc:=20=E9=98=85=E8=AF=BBjvm=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E5=91=BD=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jvm/深入理解java虚拟机.md | 58 ++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/jvm/深入理解java虚拟机.md b/jvm/深入理解java虚拟机.md index 7186ba1..5c2f654 100644 --- a/jvm/深入理解java虚拟机.md +++ b/jvm/深入理解java虚拟机.md @@ -55,6 +55,11 @@ - [G1垃圾收集器](#g1垃圾收集器) - [G1垃圾收集器内存布局](#g1垃圾收集器内存布局) - [Remembered Set](#remembered-set) + - [虚拟机内存监控和故障处理工具](#虚拟机内存监控和故障处理工具) + - [jps](#jps) + - [jstat](#jstat) + - [jinfo](#jinfo) + - [jstack](#jstack) # 深入理解java虚拟机 @@ -483,4 +488,57 @@ G1收集器中Region之间的对象引用以及其他收集器中新生代和老 +## 虚拟机内存监控和故障处理工具 +### jps +该命令会列举出正在运行的java虚拟机进程,并现实如下内容: +- 进程ID +- 虚拟机执行MainClass名称 +### jstat +jstat命令用于监视虚拟机各种运行状态信息。其可以显示本地、远程虚拟机进程中类装载、内存、垃圾收集、JIT编译等运行数据。 + +```bash +jstat [ option vmid [interval[s|ms] [count]]] +``` +在上述格式中,interval代表的是间隔,count代表的是次数,如果上述两个参数省略,代表只查询一次。假设需要每250ms查询一次进程2764的垃圾收集情况,一共查询20次,那么具体命令如下: +```bash +jstat -gc 2764 250 20 +``` + +其中,option代表用户希望查询的虚拟机信息,主要分为3类: +- 类装载 +- 垃圾收集 +- 运行期编译情况 + +| 选项 | 作用 | +| :-: | :-: | +| -class | 监视类装载、装载数量、总空间、类装载耗费时间 | +| -gc | 监视java堆内存情况,包括eden区、s0/s1区、老年代、永久代等容量、已用空间、gc时间合计等信息 | +| -gccapacity | 内容和-gc基本相同,输出主要关注java堆各个区域使用到的最大、最小空间 | +| -gcutil | 内容和-gc基本相同,输出主要关注已使用空间占总空间的百分比 | + +### jinfo +jinfo用于实时查看和调整虚拟机各项参数,使用jps -v命令可以查看jvm启动时显式指定的参数列表。 + +但是想要了解未显式指定参数的默认值,可以通过 +```bash +jinfo -flag +``` +示例如下 +```bash +jinfo -flag MaxHeapSize 5338 +``` + +除此之外,还可以通过 +```bash +jinfo -flags 5338 +``` +上述命令会输出所有参数。 + +info命令还支持打印出进程的`System.getProperties()`内容 +```bash +jinfo -sysprops 5338 +``` + +### jstack +jstack命令用于生成虚拟机当前时刻的线程快照,即当前虚拟机每一个线程正在执行的方法堆栈集合。该命令主要用于定位线程长时间出现停顿的原因,例如线程间死锁、死循环、长时间等待等。