@@ -95,10 +95,38 @@ JDK 1.8 之前永久代还没被彻底移除的时候通常通过下面这些参
9595下面是一些常用参数:
9696
9797``` bash
98- -XX:MetaspaceSize=N # 设置 Metaspace 的初始(和最小大小 )
99- -XX:MaxMetaspaceSize=N # 设置 Metaspace 的最大大小,如果不指定大小的话,随着更多类的创建,虚拟机会耗尽所有可用的系统内存。
98+ -XX:MetaspaceSize=N # 设置 Metaspace 的初始大小(是一个常见的误区,后面会解释 )
99+ -XX:MaxMetaspaceSize=N # 设置 Metaspace 的最大大小
100100```
101101
102+ ** 🐛 修正(参见: [ issue #1947 ] ( https://github.com/Snailclimb/JavaGuide/issues/1947 ) )** :
103+
104+ 1、Metaspace 的初始容量并不是 ` -XX:MetaspaceSize ` 设置,无论 ` -XX:MetaspaceSize ` 配置什么值,对于 64 位 JVM 来说,Metaspace 的初始容量都是 21807104(约 20.8m)。
105+
106+ 可以参考 Oracle 官方文档 [ Other Considerations] ( https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html ) 中提到的:
107+
108+ > Specify a higher value for the option MetaspaceSize to avoid early garbage collections induced for class metadata. The amount of class metadata allocated for an application is application-dependent and general guidelines do not exist for the selection of MetaspaceSize. The default size of MetaspaceSize is platform-dependent and ranges from 12 MB to about 20 MB.
109+ >
110+ > MetaspaceSize 的默认大小取决于平台,范围从 12 MB 到大约 20 MB。
111+
112+ 另外,还可以看一下这个试验:[ JVM 参数 MetaspaceSize 的误解] ( https://mp.weixin.qq.com/s/jqfppqqd98DfAJHZhFbmxA ) 。
113+
114+ 2、Metaspace 由于使用不断扩容到` -XX:MetaspaceSize ` 参数指定的量,就会发生 FGC,且之后每次 Metaspace 扩容都会发生 Full GC。
115+
116+ 也就是说,MetaspaceSize 表示 Metaspace 使用过程中触发 Full GC 的阈值,只对触发起作用。
117+
118+ 垃圾搜集器内部是根据变量 ` _capacity_until_GC ` 来判断 Metaspace 区域是否达到阈值的,初始化代码如下所示:
119+
120+ ``` c
121+ void MetaspaceGC::initialize () {
122+ // Set the high-water mark to MaxMetapaceSize during VM initializaton since
123+ // we can't do a GC during initialization.
124+ _ capacity_until_GC = MaxMetaspaceSize;
125+ }
126+ ```
127+
128+ 相关阅读: [ issue 更正:MaxMetaspaceSize如果不指定大小的话,不会耗尽内存 #1204 ] ( https://github.com/Snailclimb/JavaGuide/issues/1204 ) 。
129+
102130## 3.垃圾收集相关
103131
104132### 3.1.垃圾回收器
@@ -194,11 +222,11 @@ JVM 具有四种类型的 GC 实现:
194222
195223这里推荐了非常多优质的 JVM 实践相关的文章,推荐阅读,尤其是 JVM 性能优化和问题排查相关的文章。
196224
197- - [ JVM参数配置说明 - 阿里云官方文档 - 2022] ( https://help.aliyun.com/document_detail/148851.html )
198- - [ JVM内存配置最佳实践 - 阿里云官方文档 - 2022] ( https://help.aliyun.com/document_detail/383255.html )
225+ - [ JVM 参数配置说明 - 阿里云官方文档 - 2022] ( https://help.aliyun.com/document_detail/148851.html )
226+ - [ JVM 内存配置最佳实践 - 阿里云官方文档 - 2022] ( https://help.aliyun.com/document_detail/383255.html )
199227- [ 求你了,GC 日志打印别再瞎配置了 - 思否 - 2022] ( https://segmentfault.com/a/1190000039806436 )
200228- [ 一次大量 JVM Native 内存泄露的排查分析(64M 问题) - 掘金 - 2022] ( https://juejin.cn/post/7078624931826794503 )
201- - [ 一次线上JVM调优实践,FullGC40次/天到10天一次的优化过程 - HeadpDump - 2021] ( https://heapdump.cn/article/1859160 )
229+ - [ 一次线上 JVM 调优实践,FullGC40 次/天到 10 天一次的优化过程 - HeadpDump - 2021] ( https://heapdump.cn/article/1859160 )
202230- [ 听说 JVM 性能优化很难?今天我小试了一把! - 陈树义 - 2021] ( https://shuyi.tech/archives/have-a-try-in-jvm-combat )
203231- [ 你们要的线上 GC 问题案例来啦 - 编了个程 - 2021] ( https://mp.weixin.qq.com/s/df1uxHWUXzhErxW1sZ6OvQ )
204232- [ Java 中 9 种常见的 CMS GC 问题分析与解决 - 美团技术团队 - 2020] ( https://tech.meituan.com/2020/11/12/java-9-cms-gc.html )
0 commit comments