64位服务器的MetaspaceSize的默认值是多少?我在官方文件中找不到它。
我观察到,在服务器JVM进程中,GC频率有时会变得很高,并不断增长。如果我重启服务几次,它就会恢复稳定。我认为这是因为JRE升级。
JVM堆最大大小设置为6GB,但当出现此问题时,我们看到只使用了3GB堆。元空间增长很少,几乎总是满的。我尝试将元空间增加到1GB,它提高了吞吐量。
我认为现在的情况是,默认情况下,Metaspace被设置为一个非常低的值,因此GC开始工作。每次GC发生时,高水位会持续增加(再次以非常低的量增加)。
我想设置MetaspaceSize(不确定当前值是什么)。
Oracle文档说没有指南可以知道将MetaspaceSize设置为什么。但是有没有办法找出将其设置为正确的值?
我从Oracle文档中得到的一个提示是:
如果类元数据可用的提交空间占类元数据总提交空间的百分比大于MaxMetaspaceFreeRatio,那么高水位标记将会降低。如果小于MinMetaspaceFreeRatio,那么高水位标记将会升高。
但是仍然不知道如何稳定GC...我有三个问题:
从Java8开始,可以使用以下命令行选项控制两个最重要的metaspace设置:
-XX: MetaspaceSize=N
-当最初为类元数据提交的空间达到该级别时,会引发垃圾回收机制;该级别随后可能会根据收集结果提高或降低,-XX: MaxMetaspaceSize=N
-设置metaspace的最大大小。引用Oracle HotSpot VM垃圾收集调整指南,
-XX: MetaspaceSize
的值。[...]-XX: MetaspaceSize
的默认大小依赖于平台,范围从12 MB到大约20 MB。"-XX: MaxMetaspaceSize
对用于类元数据的本机内存量设置上限。"WildFly应用服务器在独立中设置元空间选项。conf
分别为96 MB/256 MB,如下所示:
... -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m ...
但是,MaxMetaspaceSize
在大型生产应用程序中可能需要大得多,因为它需要包含应用程序中所有加载类的元数据,并且您可能希望为MetaspaceSize
指定更高的值以避免早期垃圾收集。
另请参见@Eugene的答案,了解如何根据经验确定元空间设置。
我认为最有趣的问题是#3,所以我将首先回答这个问题。我处理它的方式是使用以下设置打开gc日志记录运行我的应用程序24小时:
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCCause
-XX:+PrintTenuringDistribution
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCApplicationConcurrentTime
-Xloggc:gc.log
然后我做了这个:
grep Metaspace gc.log
并看到"已使用"的值迅速增长到80M...所以我将MetaspaceSize设置为100M
-XX:MetaspaceSize=100M
瞧,由于metaspace,不再有gcs。
@Pillar的评论似乎基本上回答了您关于如何确定实现的默认元空间设置的前两个问题。。。为了完整起见,我将把它包括在这里:
java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version -XX:+UseG1GC | grep Metaspace
从技术上讲,@Pillar的评论没有告诉您任何64位服务器的默认元空间大小,但这是因为您的第一个问题有点误导,因为根据文档,这些默认值在每个实现中都有所不同。
见:
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html
具体来说,底部的部分说,“MetaspaceSize的默认大小取决于平台,范围从12 MB到大约20 MB”
MetaspaceSize
是触发完整GC
时的值,它不是初始空间,也不是最大空间。
它的默认值是20MB
(至少在jdk-8
到jdk-13
上):
java -XX:+PrintFlagsFinal -version | grep MetaspaceSize
将产生:
size_t MetaspaceSize = 21807104 // 20MB
这意味着当Metaspace
达到20MB
时,将触发完整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
并在应用程序运行至少一天后从非类空间
获取值。
关于如何控制Metaspace
还有各种其他设置,您可以像这样找到:
java -XX:+PrintFlagsFinal -version | grep Metaspace
使用指南 - 统计设置 为您详细介绍百度统计所支持的各种设置功能及使用方法,比如设置排除规则、设置跨域、添加指定广告追踪、设置转化目标等。 概述 可供设置的功能总览 设置更改后的生效时间 通配符与正则表达式转化设置 什么是转化及统计支持的转化类型 什么是页面转化 什么是转化路径 转化路径如何设置 什么是事件转化 如何查看事件ID 如何设置事件转化 Trackevent方式设置事件转化 如何查看转化
使用指南 - 统计设置 - 其它设置 为您详细介绍百度统计所支持的各种设置功能及使用方法,比如设置排除规则、设置跨域、添加指定广告追踪、设置转化目标等。 其它设置 如何关闭数据采集 数据导出服务及其开通方法 统计图标如何设置 什么是统计图标
使用指南 - 统计设置 - 转化设置 为您详细介绍百度统计所支持的各种设置功能及使用方法,比如设置排除规则、设置跨域、添加指定广告追踪、设置转化目标等。 转化设置 什么是转化及统计支持的转化类型 什么是页面转化 什么是转化路径 转化路径如何设置 什么是事件转化 如何查看事件ID 如何设置事件转化 Trackevent方式设置事件转化 如何查看转化数据 页数转化 时长转化 什么是转化收益 什么是长效
使用指南 - 统计设置 - 统计规则设置 为您详细介绍百度统计所支持的各种设置功能及使用方法,比如设置排除规则、设置跨域、添加指定广告追踪、设置转化目标等。 统计规则设置 什么是统计规则 如何设置跨域监控 跨域跟踪的用途举例 多域名网站的跨域跟踪 排除特定域名来源的访问流量 排除特定域名的访问流量 排除特定IP的访问流量 子目录介绍及设置方法 统一页面地址功能介绍
iOS 推送证书设置指南 创建应用程序 ID 创建 App ID 配置推送功能 配置推送证书 下载推送证书 安装推送证书并导出 证书验证 iOS 推送证书设置指南 更新时间:2018-03-14 17:36:17 创建应用程序 ID 苹果开发者平台登录地址 创建 App ID 配置推送功能 配置推送证书 这里只演示配置开发证书,如是生产环境,请选择相应的生产环境证书。 选择刚配好的App ID;
使用指南 - 统计设置 - 概述 为您详细介绍百度统计所支持的各种设置功能及使用方法,比如设置排除规则、设置跨域、添加指定广告追踪、设置转化目标等。 概述 可供设置的功能总览 设置更改后的生效时间 通配符与正则表达式