因此,在问了这个问题之后,很快就明白了重要的问题不是“我怎么能”,而是“我应该”吗?
我们有一些客户正在从Java7迁移到Java8(使用Tomcat7)。Java7需要设置-XX:MaxPermSize, 并且一些客户 因个人需要和使用而将 其最大值增加到安装程序所设置的默认值以上 。
-XX:MaxPermSize
我应该 设置-XX:MaxMetaspaceSize(到以前-XX:MaxPermSize的谁定义了一个自定义的最大客户设置)?新安装呢?我们应该设置-XX:MaxMetaspaceSize吗?
-XX:MaxMetaspaceSize
这样决定的利弊是什么?
正如我在前面的答案中指出的那样,对这些内存池设置限制的 原因 有所不同。
如果您的用户以前将MaxPermSize 增加到 默认值以上,则可能是为了避免CMS出现Full GC /并发模式失败,或者是因为他们的应用程序确实需要大量的perm生成空间。
将元空间限制从其有效的无限默认值减少将具有完全不同的目的:避免无限的元空间增长。
问题是那只是一个上限。实际提交的(即_当前元_空间的大小)将较小。实际上,有一个名为MaxMetaspaceFreeRatio(默认为70%)的设置,这意味着实际的元空间大小永远不会超过其占用率的230%。
MaxMetaspaceFreeRatio
而要使其增长,首先必须将其填满,强制进行垃圾回收(元空间已满),以尝试释放对象,并且只有当它不能满足其MinMetaspaceFreeRatio(默认40%)目标时,才将_当前元_ 空间扩展到不超过GC周期后占用率达到230%。
MinMetaspaceFreeRatio
因此,在实践中,除非应用程序不断泄漏类装入器/类或生成大量动态代码,否则实际的元空间大小应稳定在与其实际需要接近的范围内。
TL; DR:可能有一些限制元空间大小的原因,但它们可能与设置烫发根大小的原始原因有所不同。因此,应该重新评估需求。