@@ -4,39 +4,188 @@ date: 2018/05/29
4
4
categories :
5
5
- javase
6
6
tags :
7
+ - java
7
8
- javase
8
9
- jvm
9
10
---
10
11
11
12
# JVM 调优
12
13
13
- <!-- TOC -->
14
+ <!-- TOC depthFrom:2 depthTo:3 -->
14
15
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
+ - [ 资料] ( #资料 )
17
26
18
27
<!-- /TOC -->
19
28
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
+
20
161
## GC 优化配置
21
162
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 | 永久代最大容量 |
29
170
30
171
## GC 类型设置
31
172
32
- | 配置 | 描述 |
33
- | --- | --- |
34
- | -XX:+UseSerialGC | 串行垃圾回收器 |
35
- | -XX:+UseParallelGC | 并行垃圾回收器 |
36
- | -XX:+UseConcMarkSweepGC | 并发标记扫描垃圾回收器 |
173
+ | 配置 | 描述 |
174
+ | ----------------------- | -------------------------------------- --- |
175
+ | -XX:+UseSerialGC | 串行垃圾回收器 |
176
+ | -XX:+UseParallelGC | 并行垃圾回收器 |
177
+ | -XX:+UseConcMarkSweepGC | 并发标记扫描垃圾回收器 |
37
178
| -XX: ParallelCMSThreads = | 并发标记扫描垃圾回收器 = 为使用的线程数量 |
38
- | -XX:+UseG1GC | G1 垃圾回收器 |
179
+ | -XX:+UseG1GC | G1 垃圾回收器 |
39
180
40
181
``` java
41
182
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