Skip to content

Commit 726db60

Browse files
committed
📝 Writing docs.
1 parent f8ed68d commit 726db60

File tree

1 file changed

+166
-17
lines changed

1 file changed

+166
-17
lines changed

docs/jvm/4-JVM调优.md

Lines changed: 166 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,188 @@ date: 2018/05/29
44
categories:
55
- javase
66
tags:
7+
- java
78
- javase
89
- jvm
910
---
1011

1112
# JVM 调优
1213

13-
<!-- TOC -->
14+
<!-- TOC depthFrom:2 depthTo:3 -->
1415

15-
* [GC 优化配置](#gc-优化配置)
16-
* [GC 类型设置](#gc-类型设置)
16+
- [命令](#命令)
17+
- [jmap](#jmap)
18+
- [jstack](#jstack)
19+
- [jps](#jps)
20+
- [jstat](#jstat)
21+
- [jhat](#jhat)
22+
- [jinfo](#jinfo)
23+
- [GC 优化配置](#gc-优化配置)
24+
- [GC 类型设置](#gc-类型设置)
25+
- [资料](#资料)
1726

1827
<!-- /TOC -->
1928

29+
## 命令
30+
31+
### jmap
32+
33+
jmap 即 JVM Memory Map。
34+
35+
**jmap 用于生成 heap dump 文件**
36+
37+
如果不使用这个命令,还可以使用 `-XX:+HeapDumpOnOutOfMemoryError` 参数来让虚拟机出现 OOM 的时候,自动生成 dump 文件。
38+
39+
jmap 不仅能生成 dump 文件,还可以查询 finalize 执行队列、Java 堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。
40+
41+
命令格式:
42+
43+
```
44+
jmap [option] LVMID
45+
```
46+
47+
option 参数:
48+
49+
- dump - 生成堆转储快照
50+
- finalizerinfo - 显示在 F-Queue 队列等待 Finalizer 线程执行 finalizer 方法的对象
51+
- heap - 显示 Java 堆详细信息
52+
- histo - 显示堆中对象的统计信息
53+
- permstat - to print permanent generation statistics
54+
- F - 当-dump 没有响应时,强制生成 dump 快照
55+
56+
示例:
57+
58+
dump 堆到文件,format 指定输出格式,live 指明是活着的对象,file 指定文件名
59+
60+
```
61+
$ jmap -dump:live,format=b,file=dump.hprof 28920
62+
Dumping heap to /home/xxx/dump.hprof ...
63+
Heap dump file created
64+
```
65+
66+
dump.hprof 这个后缀是为了后续可以直接用 MAT(Memory Anlysis Tool)打开。
67+
68+
### jstack
69+
70+
**jstack 用于生成 java 虚拟机当前时刻的线程快照。**
71+
72+
线程快照是当前 java 虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
73+
74+
线程出现停顿的时候通过 jstack 来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果 java 程序崩溃生成 core 文件,jstack 工具可以用来获得 core 文件的 java stack 和 native stack 的信息,从而可以轻松地知道 java 程序是如何崩溃和在程序何处发生问题。另外,jstack 工具还可以附属到正在运行的 java 程序中,看到当时运行的 java 程序的 java stack 和 native stack 的信息, 如果现在运行的 java 程序呈现 hung 的状态,jstack 是非常有用的。
75+
76+
命令格式:
77+
78+
```
79+
jstack [option] LVMID
80+
```
81+
82+
option 参数:
83+
84+
- `-F` - 当正常输出请求不被响应时,强制输出线程堆栈
85+
- `-l` - 除堆栈外,显示关于锁的附加信息
86+
- `-m` - 如果调用到本地方法的话,可以显示 C/C++的堆栈
87+
88+
### jps
89+
90+
jps(JVM Process Status Tool),显示指定系统内所有的 HotSpot 虚拟机进程。
91+
92+
命令格式:
93+
94+
```
95+
jps [options] [hostid]
96+
```
97+
98+
option 参数:
99+
100+
- `-l` - 输出主类全名或 jar 路径
101+
- `-q` - 只输出 LVMID
102+
- `-m` - 输出 JVM 启动时传递给 main()的参数
103+
- `-v` - 输出 JVM 启动时显示指定的 JVM 参数
104+
105+
其中[option][hostid]参数也可以不写。
106+
107+
```
108+
$ jps -l -m
109+
28920 org.apache.catalina.startup.Bootstrap start
110+
11589 org.apache.catalina.startup.Bootstrap start
111+
25816 sun.tools.jps.Jps -l -m
112+
```
113+
114+
### jstat
115+
116+
jstat(JVM statistics Monitoring),是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据。
117+
118+
命令格式:
119+
120+
```
121+
jstat [option] LVMID [interval] [count]
122+
```
123+
124+
参数:
125+
126+
- [option] - 操作参数
127+
- LVMID - 本地虚拟机进程 ID
128+
- [interval] - 连续输出的时间间隔
129+
- [count] - 连续输出的次数
130+
131+
### jhat
132+
133+
jhat(JVM Heap Analysis Tool),是与 jmap 搭配使用,用来分析 jmap 生成的 dump,jhat 内置了一个微型的 HTTP/HTML 服务器,生成 dump 的分析结果后,可以在浏览器中查看。
134+
135+
注意:一般不会直接在服务器上进行分析,因为 jhat 是一个耗时并且耗费硬件资源的过程,一般把服务器生成的 dump 文件复制到本地或其他机器上进行分析。
136+
137+
命令格式:
138+
139+
```
140+
jhat [dumpfile]
141+
```
142+
143+
### jinfo
144+
145+
jinfo(JVM Configuration info),用于实时查看和调整虚拟机运行参数。
146+
147+
之前的 jps -v 口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用 jinfo 口令
148+
149+
命令格式:
150+
151+
```
152+
jinfo [option] [args] LVMID
153+
```
154+
155+
option 参数:
156+
157+
> - -flag : 输出指定 args 参数的值
158+
> - -flags : 不需要 args 参数,输出所有 JVM 参数的值
159+
> - -sysprops : 输出系统属性,等同于 System.getProperties()
160+
20161
## GC 优化配置
21162

22-
| 配置 | 描述 |
23-
| --- | --- |
24-
| -Xms | 初始化堆内存大小 |
25-
| -Xmx | 堆内存最大值 |
26-
| -Xmn | 新生代大小 |
27-
| -XX:PermSize | 初始化永久代大小 |
28-
| -XX:MaxPermSize | 永久代最大容量 |
163+
| 配置 | 描述 |
164+
| --------------- | ---------------- |
165+
| -Xms | 初始化堆内存大小 |
166+
| -Xmx | 堆内存最大值 |
167+
| -Xmn | 新生代大小 |
168+
| -XX:PermSize | 初始化永久代大小 |
169+
| -XX:MaxPermSize | 永久代最大容量 |
29170

30171
## GC 类型设置
31172

32-
| 配置 | 描述 |
33-
| --- | --- |
34-
| -XX:+UseSerialGC | 串行垃圾回收器 |
35-
| -XX:+UseParallelGC | 并行垃圾回收器 |
36-
| -XX:+UseConcMarkSweepGC | 并发标记扫描垃圾回收器 |
173+
| 配置 | 描述 |
174+
| ----------------------- | ----------------------------------------- |
175+
| -XX:+UseSerialGC | 串行垃圾回收器 |
176+
| -XX:+UseParallelGC | 并行垃圾回收器 |
177+
| -XX:+UseConcMarkSweepGC | 并发标记扫描垃圾回收器 |
37178
| -XX:ParallelCMSThreads= | 并发标记扫描垃圾回收器 = 为使用的线程数量 |
38-
| -XX:+UseG1GC | G1 垃圾回收器 |
179+
| -XX:+UseG1GC | G1 垃圾回收器 |
39180

40181
```java
41182
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar
42-
```
183+
```
184+
185+
## 资料
186+
187+
[JVM(4):Jvm 调优-命令篇](http://www.importnew.com/23761.html)
188+
http://www.hollischuang.com/archives/110
189+
https://segmentfault.com/a/1190000005174819
190+
http://www.importnew.com/19264.html
191+
https://blog.csdn.net/lxhandlbb/article/details/76695607

0 commit comments

Comments
 (0)