Skip to content

Commit d6e42e3

Browse files
committed
blog
1 parent 383d30d commit d6e42e3

713 files changed

Lines changed: 3113 additions & 2098 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/.vuepress/dist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Subproject commit ad6ee90be95fa08615671497b33a84874117c823
1+
Subproject commit ed25dda4e371f2c44c7402adc42445074e512e74

docs/java/JVM/JVM参数配置.md

Lines changed: 56 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
# JVM 参数配置
22

3-
> 你说你做过 JVM 调优和参数配置,那你平时工作用过的配置参数有哪些?
3+
> 面试官:你说你做过 JVM 调优和参数配置,那你平时工作用过的配置参数有哪些?
44
55
![](https://tva1.sinaimg.cn/large/007S8ZIlly1gjlfuwkbr3j31hi0u0qv7.jpg)
66

7-
## JVM参数类型
7+
## JVM 参数类型
88

99
JVM 参数类型大致分为以下几类:
1010

11-
- **标准参数**(-),即在 JVM 的各个版本中基本不变的,相对比较稳定的参数,向后兼容
11+
- **标准参数**(-),即在 JVM 的各个版本中基本不变的,相对比较稳定的参数,向后兼容;
1212
- **非标准参数**(-X),变化比较小的参数,默认 JVM 实现这些参数的功能,但是并不保证所有 JVM 实现都满足,且不保证向后兼容;
1313
- **非Stable参数**(-XX),此类参数各个 JVM 实现会有所不同,将来可能会随时取消,需要慎重使用;
1414

1515

1616

1717
### 标准参数
1818

19-
![](https://imgkr.cn-bj.ufileos.com/798c9e1c-5aae-4798-a2eb-7bb7e454c9e1.png)
19+
通过命令 `java` 即可查看
20+
21+
![](https://tva1.sinaimg.cn/large/0081Kckwly1gkamd9p5slj30u011mjzk.jpg)
2022

2123
- `-version`:输出 java 的版本信息,比如 jdk 版本、vendor、model
2224
- `-help`:输出 java 标准参数列表及其描述
@@ -35,9 +37,9 @@ JVM 参数类型大致分为以下几类:
3537

3638
### X 参数
3739

38-
非标准参数又称为扩展参数,其列表如下
40+
非标准参数又称为扩展参数,通过命令 `java -X` 查看,其列表如下
3941

40-
![](https://imgkr.cn-bj.ufileos.com/52aa1112-79d8-495b-9dae-ff284aefc204.png)
42+
![](https://tva1.sinaimg.cn/large/0081Kckwly1gkamht10qaj30u00yaqbu.jpg)
4143

4244
- `-Xint`:设置 jvm 以解释模式运行,所有的字节码将被直接执行,而不会编译成本地码
4345
- -Xmixed:混合模式,JVM自己来决定是否编译成本地代码,默认使用的就是混合模式
@@ -54,8 +56,41 @@ JVM 参数类型大致分为以下几类:
5456

5557

5658

59+
### xx 参数
60+
61+
- -XX:+PrintFlagsInitial
62+
63+
- 主要查看初始默认值
64+
65+
- java -XX:+PrintFlagsInitial
5766

58-
### xx参数
67+
- java -XX:+PrintFlagsInitial -version
68+
69+
- ![](https://tva1.sinaimg.cn/large/0081Kckwly1gkan7em5moj318o0peq9p.jpg)
70+
71+
**等号前有冒号** := 说明 jvm 参数有人为修改过或者 JVM加载修改
72+
73+
false 说明是Boolean 类型 参数,数字说明是 KV 类型参数
74+
75+
- -XX:+PrintFlagsFinal
76+
77+
![](https://tva1.sinaimg.cn/large/0081Kckwly1gkanbdiozxj31700q2dmr.jpg)
78+
79+
- 主要查看修改更新
80+
- java -XX:+PrintFlagsFinal
81+
- java -XX:+PrintFlagsFinal -version
82+
- 运行java命令的同时打印出参数 java -XX:+PrintFlagsFinal -XX:MetaspaceSize=512m Hello.java
83+
84+
- -XX:+PrintCommondLineFlags
85+
86+
- 打印命令行参数
87+
- java -XX:+PrintCommandLineFlags -version
88+
- 可以方便的看到垃圾回收器
89+
- ![](https://tva1.sinaimg.cn/large/0081Kckwly1gkangitwxaj31py06ijtn.jpg)
90+
91+
92+
93+
xx 参数主要分为 Boolean 类型参数和 KV 类型参数,我们一一介绍下
5994

6095
#### Boolean 类型
6196

@@ -68,7 +103,7 @@ JVM 参数类型大致分为以下几类:
68103
- `-XX:+PrintGCDetails `
69104
- `-XX:-PrintGCDetails `
70105

71-
![img](https://tva1.sinaimg.cn/large/00831rSTly1gdebpozfgwj315o0sgtcy.jpg)
106+
![](https://tva1.sinaimg.cn/large/00831rSTly1gdebpozfgwj315o0sgtcy.jpg)
72107

73108
添加如下参数后,重新查看,发现是 + 号了
74109

@@ -192,95 +227,27 @@ System.out.println("max_memory(-xmx)="+maxMemory+"字节," +(maxMemory/(double
192227

193228
经过前面对 JVM 参数的介绍及相关例子的实验,相信大家对 JVM 的参数有了比较深刻的理解,接下来我们再谈谈如何设置 JVM 参数
194229

195-
1首先 Oracle 官方推荐堆的初始化大小与堆可设置的最大值一般是相等的,即 Xms = Xmx,因为起始堆内存太小(Xms),会导致启动初期频繁 GC,起始堆内存较大(Xmx)有助于减少 GC 次数
230+
1. 首先 Oracle 官方推荐堆的初始化大小与堆可设置的最大值一般是相等的,即 Xms = Xmx,因为起始堆内存太小(Xms),会导致启动初期频繁 GC,起始堆内存较大(Xmx)有助于减少 GC 次数
196231

197-
2调试的时候设置一些打印参数,如-XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log,这样可以从gc.log里看出一些端倪出来
232+
2. 调试的时候设置一些打印参数,如 `-XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log`,这样可以从 gc.log 里看出一些端倪出来
198233

199-
3系统停顿时间过长可能是 GC 的问题也可能是程序的问题,多用 jmap 和 jstack 查看,或者killall -3 Java,然后查看 Java 控制台日志,能看出很多问题
234+
3. 系统停顿时间过长可能是 GC 的问题也可能是程序的问题,多用 jmap 和 jstack 查看,或者 `killall -3 Java`,然后查看 Java 控制台日志,能看出很多问题
200235

201-
4 采用并发回收时,年轻代小一点,年老代要大,因为年老大用的是并发回收,即使时间长点也不会影响其他程序继续运行,网站不会停顿
236+
4. 采用并发回收时,年轻代小一点,年老代要大,因为年老大用的是并发回收,即使时间长点也不会影响其他程序继续运行,网站不会停顿
202237

203-
5仔细了解自己的应用,如果用了缓存,那么年老代应该大一些,缓存的 HashMap 不应该无限制长,建议采用 LRU 算法的 Map 做缓存,LRUMap 的最大长度也要根据实际情况设定
238+
5. 仔细了解自己的应用,如果用了缓存,那么年老代应该大一些,缓存的 HashMap 不应该无限制长,建议采用 LRU 算法的 Map 做缓存,LRUMap 的最大长度也要根据实际情况设定
204239

205240
要设置好各种 JVM 参数,还可以对 server 进行压测, 预估自己的业务量,设定好一些 JVM 参数进行压测看下这些设置好的 JVM 参数是否能满足要求
206241

207242

208243

209244

210245

211-
## JVM 参数简介
212-
213-
在开始实践之前我们有必要先简单了解一下 JVM 参数配置,因为本文之后的实验中提到的 JVM 中的栈,堆大小,使用的垃圾收集器等都需要通过 JVM 参数来设置
214-
215-
先来看下如何运行一个 Java 程序
216-
217-
```java
218-
public class Test {
219-
public static void main(String[] args) {
220-
System.out.println("test");
221-
}
222-
}
223-
```
224-
225-
1. 首先我们通过 **javac Test.java** 将其转成字节码
226-
227-
2. 其次我们往往会输入 **java Test** 这样的命令来启动 JVM 进程来执行此程序,其实我们在启动 JVM 进程的时候,可以指定相应的 JVM 的参数,如下蓝色部分
228-
229-
![img](https://mmbiz.qpic.cn/mmbiz_png/OyweysCSeLVIoXNqicyWxibebAvTuJxk44ib4JwRjzBAdiaI7oY4dmXe1oNIQfRluUy9xPvjXX5ZF15XNZFKmDnxVA/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
230-
231-
指定这些 JVM 参数我们就可以指定启动 JVM 进程以哪种模式(server 或 client),运行时分配的堆大小,栈大小,用什么垃圾收集器等等,JVM 参数主要分以下三类
232-
233-
1、 标准参数(-),所有的 JVM 实现都必须实现这些参数的功能,而且向后兼容;例如 **-verbose:gc**(输出每次GC的相关情况)
234-
235-
2、 非标准参数(-X),默认 JVM 实现这些参数的功能,但是并不保证所有 JVM 实现都满足,且不保证向后兼容,栈,堆大小的设置都是通过这个参数来配置的,用得最多的如下
236-
237-
| 参数示例 | 表示意义 |
238-
| :------- | :-------------------------------- |
239-
| -Xms512m | JVM 启动时设置的初始堆大小为 512M |
240-
| -Xmx512m | JVM 可分配的最大堆大小为 512M |
241-
| -Xmn200m | 设置的年轻代大小为 200M |
242-
| -Xss128k | 设置每个线程的栈大小为 128k |
243-
244-
3、非Stable参数(-XX),此类参数各个 jvm 实现会有所不同,将来可能会随时取消,需要慎重使用, -XX:-option 代表关闭 option 参数,-XX:+option 代表要关闭 option 参数,例如要启用串行 GC,对应的 JVM 参数即为 -XX:+UseSerialGC。非 Stable 参数主要有三大类
245-
246-
- 行为参数(Behavioral Options):用于改变 JVM 的一些基础行为,如启用串行/并行 GC
247-
248-
| 参数示例 | 表示意义 |
249-
| :---------------------- | :-------------------------------------------------------- |
250-
| -XX:-DisableExplicitGC | 禁止调用System.gc();但jvm的gc仍然有效 |
251-
| -XX:-UseConcMarkSweepGC | 对老生代采用并发标记交换算法进行GC |
252-
| -XX:-UseParallelGC | 启用并行GC |
253-
| -XX:-UseParallelOldGC | 对Full GC启用并行,当-XX:-UseParallelGC启用时该项自动启用 |
254-
| -XX:-UseSerialGC | 启用串行GC |
255-
256-
- 性能调优(Performance Tuning):用于 jvm 的性能调优,如设置新老生代内存容量比例
257-
258-
| 参数示例 | 表示意义 |
259-
| :---------------------------- | :------------------------------------ |
260-
| -XX:MaxHeapFreeRatio=70 | GC后java堆中空闲量占的最大比例 |
261-
| -XX:NewRatio=2 | 新生代内存容量与老生代内存容量的比例 |
262-
| -XX:NewSize=2.125m | 新生代对象生成时占用内存的默认值 |
263-
| -XX:ReservedCodeCacheSize=32m | 保留代码占用的内存容量 |
264-
| -XX:ThreadStackSize=512 | 设置线程栈大小,若为0则使用系统默认值 |
265-
266-
- 调试参数(Debugging Options):一般用于打开跟踪、打印、输出等 JVM 参数,用于显示 JVM 更加详细的信息
267-
268-
| 参数示例 | 表示意义 |
269-
| :-------------------------------- | :---------------------------------- |
270-
| -XX:HeapDumpPath=./java_pid.hprof | 指定导出堆信息时的路径或文件名 |
271-
| -XX:-HeapDumpOnOutOfMemoryError | 当首次遭遇OOM时导出此时堆中相关信息 |
272-
| -XX:-PrintGC | 每次GC时打印相关信息 |
273-
| -XX:-PrintGC Details | 每次GC时打印详细信息 |
274-
275-
*画外音:以上只是列出了比较常用的 JVM 参数,更多的 JVM 参数介绍请查看文末的参考资料*
276-
277-
明白了 JVM 参数是干啥用的,接下来我们进入实战演练,下文中所有程序运行时对应的 JVM 参数都以 VM Args 的形式写在开头的注释里,读者如果在执行程序时记得要把这些 JVM 参数给带上哦
278-
279-
246+
## 工作中常用配置
280247

281248
https://docs.oracle.com/javacomponents/jrockit-hotspot/migration-guide/cloptions.htm#JRHMG127
282249

283-
参数不懂,推荐直接去看官网
250+
参数不懂,推荐直接去看官网
284251

285252
- -Xms
286253

@@ -318,7 +285,7 @@ https://docs.oracle.com/javacomponents/jrockit-hotspot/migration-guide/cloptions
318285

319286
定义一个大对象,撑爆堆内存,
320287

321-
```
288+
```java
322289
public static void main(String[] args) throws InterruptedException {
323290
System.out.println("==hello gc===");
324291

@@ -328,15 +295,9 @@ https://docs.oracle.com/javacomponents/jrockit-hotspot/migration-guide/cloptions
328295

329296
byte[] bytes = new byte[11 * 1024 * 1024];
330297

331-
}![](https://tva1.sinaimg.cn/large/007S8ZIlly1gehkvas3vzj31a90u0n7t.jpg)
298+
}
332299
```
333300

334-
- Full GC![img](https://tva1.sinaimg.cn/large/00831rSTly1gdefrc3lmbj31hy0gk7of.jpg)
335-
336-
![img](https://tva1.sinaimg.cn/large/00831rSTly1gdefr8tvx0j31h60m41eq.jpg)
337-
338-
- GC![img](https://tva1.sinaimg.cn/large/00831rSTly1gdefrf0dfqj31fs0honjk.jpg)
339-
340301
- -XX:SurvivorRatio
341302

342303
- 设置新生代中 eden 和S0/S1空间的比例
@@ -352,63 +313,24 @@ https://docs.oracle.com/javacomponents/jrockit-hotspot/migration-guide/cloptions
352313
- -XX:MaxTenuringThreshold
353314

354315
- 设置垃圾的最大年龄(java8 固定设置最大 15
355-
- ![img](https://tva1.sinaimg.cn/large/00831rSTly1gdefr4xeq1j31g80lek6e.jpg)
356-
357-
358-
359-
![img](https://tva1.sinaimg.cn/large/00831rSTly1gdee0iss88j31eu0n6aqi.jpg)
360-
361-
## 3. 你平时工作用过的 JVM 常用基本配置参数有哪些?
362-
363-
- -XX:+PrintFlagsInitial
364-
365-
- 主要查看初始默认值
366-
367-
- java -XX:+PrintFlagsInitial
368-
369-
- java -XX:+PrintFlagsInitial -version
370-
371-
- ![img](https://tva1.sinaimg.cn/large/00831rSTly1gdee0ndg33j31ci0m6k5w.jpg)
372-
373-
**等号前有冒号** := 说明 jvm 参数有人为修改过或者 JVM加载修改
374-
375-
false 说明是Boolean 类型 参数,数字说明是 KV 类型参数
376-
377-
- -XX:+PrintFlagsFinal
378-
379-
- 主要查看修改更新
380-
- java -XX:+PrintFlagsFinal
381-
- java -XX:+PrintFlagsFinal -version
382-
- 运行java命令的同时打印出参数 java -XX:+PrintFlagsFinal -XX:MetaspaceSize=512m Hello.java
383-
384-
- -XX:+PrintCommondLineFlags
385316

386-
- 打印命令行参数
387-
- java -XX:+PrintCommondLineFlags -version
388-
- 可以方便的看到垃圾回收器
389-
- ![img](https://tva1.sinaimg.cn/large/007S8ZIlly1gehf1e54soj31e006qjz6.jpg)
390-
391-
### 盘点家底查看JVM默认值
392317

393318

319+
## 最后
394320

395321
参数不懂,推荐直接去看官网,
396322

397-
https://docs.oracle.com/javacomponents/jrockit-hotspot/migration-guide/cloptions.htm#JRHMG127
398-
399-
400-
401323
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BGBCIEFC
402324

325+
https://docs.oracle.com/javacomponents/jrockit-hotspot/migration-guide/cloptions.htm#JRHMG127
326+
403327
https://docs.oracle.com/javase/8/
404328

405329
Java SE Tools Reference for UNIX](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html)
406330

407331

408332

409-
410-
411-
333+
参考:
412334

413335
https://www.cnblogs.com/duanxz/p/3482366.html
414336

node_modules/.cache/terser-webpack-plugin/content-v2/sha512/00/89/1f93c2340fc00c5183e685667fc182d74d7d6e9b225ab0b01e89029530c68ea0be3c97a74c1b953059f66694ad3b1ba8b3c4779727a3f694a9df5e296a35

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.cache/terser-webpack-plugin/content-v2/sha512/03/d3/dd5f25659cff912f55815f4110702c2a40e3642ea848b8ba01d70b82edb0bd57451f51f94a22442a30371c17b4d08e9af28eaef8112f5fd4256be604215f

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.cache/terser-webpack-plugin/content-v2/sha512/04/3d/7cccbbce18020f71d506993c321eabe9ad66a340e47f3da399945f90e8bd9860aff8d1837d61db8bcc42eaea80f6f0a711ec58495aa83632e0fd98578f73

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.cache/terser-webpack-plugin/content-v2/sha512/0a/fc/e839992262f1490abec0b20e5ff5cc10a8a3db965e30612017f857459e8c32147599f169a6cc5bc885d1eb03932512589e7407b23d3dab94426c425b8118

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.cache/terser-webpack-plugin/content-v2/sha512/0d/0c/0cb982f6fa1b279cb2bca4c98d5d3b199d7754a4659c7d03f981be3feaf972dea5e1afe293ee98e7781f316cca963bdec2d0e5c70fc368d04d92d5cc12ab

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.cache/terser-webpack-plugin/content-v2/sha512/0d/8b/abd009e42a23a0e3e24f3987840d158261e9256e3828c39ec9f8a4a9f8c33a3f65ece363d7273fe50d9d3590c12c8cb295d4961906d6c0bc4f6f073ee11e

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.cache/terser-webpack-plugin/content-v2/sha512/0e/7c/a308f149d3d8c46ce430d960913c8026f66328b0e81572d3a2b14144bd0f6d6644f90ee44ba3370d2c0103181c2d98e6770b8983692461113e158fef6d36

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.cache/terser-webpack-plugin/content-v2/sha512/0f/12/348617610442e5a8063a7b3cffd8dbb15bdf717b81ddefdf98b67eee7a6857b22dd32fc2254cb10c168d08d851bc8d4018b9aedc2f0df5d5c26e19097134

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)