【发布时间】:2016-07-27 16:28:07
【问题描述】:
对于 64 位服务器,MetaspaceSize 的默认值是多少?官方文档里没找到。
我观察到,在服务器 JVM 进程中,有时 GC 频率会变高并不断增长。如果我重新启动服务几次,它会恢复稳定。我认为这是由于 JRE 升级。
JVM 堆最大大小设置为 6GB,但是当出现此问题时,我们看到仅使用了 3GB 堆。元空间增长很小,几乎总是满的。我尝试将元空间增加到 1GB,它提高了吞吐量。
我认为发生的情况是 Metaspace 默认设置为非常低的值,因此 GC 启动。每次 GC 发生时,高水位标记都会不断增加(再次增加非常低的量)。
我想设置 MetaspaceSize(不确定当前值是多少)。
Oracle 文档说没有指南可以知道将 MetaspaceSize 设置为什么。但是有没有办法找出设置它的正确值是多少?
我从 Oracle 文档中得到的一个提示是:
If the committed space available for class metadata as a percentage of the total committed space for class metadata is greater than MaxMetaspaceFreeRatio, then the high-water mark will be lowered. If it is less than MinMetaspaceFreeRatio, then the high-water mark will be raised.
但仍然无法弄清楚如何稳定 GC..我有三个问题:
- 64 位服务器上的默认 MetaspaceSize 是多少?
- 什么是默认比率:MaxMetaspaceFreeRatio、MinMetaspaceFreeRatio 设置为?答:显示Min是40,Max是70
- 如何确定 Metaspacesize 值?
【问题讨论】:
-
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version -XX:+UseG1GC | grep Metaspace -
“我认为 Metaspace 默认设置为非常低的值,因此 GC 启动”——你为什么这么认为?您的解释没有暗示为什么首先应该归咎于元空间,而不仅仅是一般的堆(或可用 RAM)。
-
@Holger 我已经更新了描述,详细说明了为什么我认为元空间是问题所在。元空间不是第一个受到指责的人。
-
好问题。我们也对答案感兴趣。我们最近在 java 8 中开发了一个新的 webapp,在部署到服务器后发现它使用了超过 2.5 GB 的 Headspace 和 90 GB 的肉空间并加载了超过 17 K 的类。所以我们也有兴趣了解如何为 Java 8 webapps 调整 VM
-
@Savior 你不需要
UnlockDiagnosticVMOptions来找出Metaspace的那些默认 值。
标签: java memory-leaks java-8 out-of-memory metaspace