设置MetaspaceSize的指南 – java 8

对于64位服务器,MetaspaceSize的默认值是多少?我在官方文档中找不到它.

我观察到,在服务器JVM进程中,GC频率有时变高并且不断增长.如果我重启服务几次,它会恢复稳定.我认为这是由于JRE的升级.

JVM堆最大大小设置为6GB但是当出现此问题时,我们看到只使用了3GB堆. Metaspace增长很少,几乎总是满的.我尝试将元空间增加到1GB,这样可以提高吞吐量.

我认为正在发生的事情是Metaspace默认设置为一个非常低的值,因此GC启动.每次GC发生时,高水位标记不断增加(再次以非常低的量).

我想设置MetaspaceSize(不确定当前值是多少).

Oracle文档称,没有指导方针可以知道将MetaspaceSize设置为什么.但有没有办法找出设置它的正确值是什么?

我从Oracle文档中得到的一个提示是:

如果类元数据的可用空间占类元数据总承诺空间的百分比大于MaxMetaspaceFreeRatio,则高水位标记将降低.如果它小于MinMetaspaceFreeRatio,则会提高高水位线.

但仍然无法弄清楚如何稳定GCs.我有三个问题:

> 64位服务器上的默认MetaspaceSize是什么?
>默认比率是多少:MaxMetaspaceFreeRatio,MinMetaspaceFreeRatio设置为?答:显示Min为40,Max为70
>如何决定Metaspacesize值?

最佳答案 我认为最有趣的问题是#3,所以我先回答一下.我接近它的方法是使用以下设置启动gc日志记录24小时运行我的应用程序:

-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCCause
-XX:+PrintTenuringDistribution
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCApplicationConcurrentTime
-Xloggc:gc.log

然后我这样做了:

grep Metaspace gc.log

并且看到“used”值迅速增长到80M ……所以我将MetaspaceSize设置为100M

-XX:MetaspaceSize=100M

瞧 – 由于元空间而没有更多的gcs.

看起来@ Pillar的评论几乎回答了关于如何确定实现的默认Metaspace设置的前两个问题……为了完整性,我将在此处包含它:

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version -XX:+UseG1GC | grep Metaspace

从技术上讲,@ Pillar的评论并没有告诉你任何64位服务器的默认Metaspace大小,但这是因为你的第一个问题有点误导,因为根据文档,这些默认值因实现而异.

看到:

https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html

具体来说,底部的部分称为“MetaspaceSize的默认大小取决于平台,范围从12 MB到大约20 MB”

点赞