64位服务器的MetaspaceSize默认值是多少?我在官方文件里找不到。
我观察到,在服务器JVM进程中,有时GC频率会变得很高并不断增长。如果我重新启动服务几次,它就会恢复稳定。我认为这是由于JRE的升级。
大小被设置为6GB,但当出现此问题时,我们只看到使用3GB堆。梅特斯帕斯长得很小,而且几乎总是满的。我尝试将metaspace提高到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.
但我还是想不出如何稳定GCs。我有三个问题:
发布于 2019-11-19 19:57:21
MetaspaceSize
是Full GC
将被触发的值,它既不是初始空间,也不是最大空间。
它的默认值是20MB
(至少在jdk-8
到jdk-13
上是这样):
java -XX:+PrintFlagsFinal -version | grep MetaspaceSize
将产生:
size_t MetaspaceSize = 21807104 // 20MB
这意味着,当Metaspace
到达20MB
时,将触发一个Full GC
,如果您能够避免它,那就太好了。
考虑到数据元空间可以容纳多少数据(方法、注释等),在我看来,20MB
是一个非常小的值。不幸的是,选择正确的值并不容易。
您有两个选项,启用gc日志记录-Xlog:gc
,让应用程序运行一段时间,然后找到如下实例:
[Full GC (Metadata GC Threshold) ...]
从这些中了解你需要设置什么以及如何设置。
或以下列方式启动该过程:
java -XX:NativeMemoryTracking=detail
通过以下方式连接到PID
:
jcmd <YourJVMPID> VM.metaspace
找到这样的线条:
Virtual space:
Non-class space: 8.00 MB reserved, 4.25 MB ( 53%) committed
Class space: 1.00 GB reserved, 512.00 KB ( <1%) committed
Both: 1.01 GB reserved, 4.75 MB ( <1%) committed
在应用程序运行了至少一天之后,从Non-class space
中获取值。
关于如何控制Metaspace
,还有其他各种设置,如下所示:
java -XX:+PrintFlagsFinal -version | grep Metaspace
发布于 2017-09-27 17:39:16
我认为最有趣的问题是#3,所以我会先回答这个问题。我的方法是使用以下设置运行我的应用程序24小时,并打开gc日志记录:
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCCause
-XX:+PrintTenuringDistribution
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCApplicationConcurrentTime
-Xloggc:gc.log
然后我做了这个:
grep Metaspace gc.log
看到“使用”的价值迅速增长到8000万.所以我把MetaspaceSize设为100米
-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”。
发布于 2019-08-02 15:28:40
从Java 8开始,可以使用以下命令行选项来控制两个最重要的metaspace设置:
-XX:MetaspaceSize=N
--当最初为类元数据提交的空间达到此级别时,将产生垃圾收集;级别随后可能会根据收集结果而提高或降低,-XX:MaxMetaspaceSize=N
-设置元空间的最大大小。-XX:MetaspaceSize
__的值。..。-XX:MetaspaceSize
的默认大小与平台有关,范围从12 MB到20 MB。“-XX:MaxMetaspaceSize
对用于类元数据的本机内存量设置上限。”WildFly应用服务器将standalone.conf
中的metaspace选项分别设置为96 MB / 256 MB,如下所示:
... -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m ...
但是,在大型生产应用程序中,MaxMetaspaceSize
可能需要大得多,因为它需要包含应用程序中所有加载类的元数据,您可能希望为MetaspaceSize
指定一个更高的值,以避免早期的垃圾回收。
还请参阅@Eugene的答案,以了解如何经验地确定metaspace设置。
https://stackoverflow.com/questions/36465192
复制相似问题