Tomcat 我应该设置MaxMetaspaceSize吗?

Tomcat 我应该设置MaxMetaspaceSize吗?,tomcat,memory-management,java-8,Tomcat,Memory Management,Java 8,所以,在提出问题后,很快就清楚了,重要的问题不是“我怎么能”,而是“我应该”吗 我们有一些客户正在从Java7迁移到Java8(使用Tomcat7)。Java7需要设置-XX:MaxPermSize,,一些客户由于个人需要和使用,已将其最大值提高到安装程序默认设置的值以上 我是否应该为已定义自定义最大值的客户设置-XX:MaxMetaspaceSize(设置为先前的-XX:MaxPermSize设置)?新的安装怎么样?我们是否应该设置-XX:MaxMetaspaceSize 这样一个决定的利弊是

所以,在提出问题后,很快就清楚了,重要的问题不是“我怎么能”,而是“我应该”吗

我们有一些客户正在从Java7迁移到Java8(使用Tomcat7)。Java7需要设置
-XX:MaxPermSize
,一些客户由于个人需要和使用,已将其最大值提高到安装程序默认设置的值以上

我是否应该为已定义自定义最大值的客户设置
-XX:MaxMetaspaceSize
(设置为先前的
-XX:MaxPermSize
设置)?新的安装怎么样?我们是否应该设置
-XX:MaxMetaspaceSize


这样一个决定的利弊是什么?

正如我在前面的回答中所评论的,对这些内存池设置限制的原因是不同的

如果您的用户先前将MaxPermSize增加到默认值以上,那么这可能是为了避免CMS出现完全GCs/并发模式故障,或者是因为他们的应用程序确实需要大量perm gen空间

将元空间限制从其有效的无限默认值中降低将达到完全不同的目的:避免无限元空间增长

问题是这只是一个上限。实际提交的,即当前元空间大小将更小。事实上,有一个名为
MaxMetaspaceFreeRatio
(默认值70%)的设置,这意味着实际的元空间大小永远不会超过其占用率的230%

要使其增长,首先必须填充,强制垃圾收集(元空间已满)以释放对象,并且只有当它无法满足其
MinMetaspaceFreeRatio
(默认值40%)目标时,才会在GC循环后将当前元空间扩展到不超过占用率的230%

因此,在实践中,实际的元空间大小应该稳定在与其实际需要接近的范围内,除非应用程序不断泄漏类加载器/类或生成大量动态代码


TL;DR:可能有限制元空间大小的原因,但它们可能与设置perm gen大小的原始原因不同。因此,需要重新评估。

来自@eckes comments的回答:


我会设置一个最大值,它足够大,在正常情况下不会触发 情况。我这样说的原因是,一个系统可能会起到非常重要的作用 如果本机内存耗尽或不可用,则不稳定且难以控制 交换发生了。比OOM或Java冻结更糟糕。例如 使用2GB(要求系统至少有2GB的可用缓冲区)


为了表达相反的观点,我们可以设置MaxMetaspaceSize。将全世界的应用程序集分成10个组(二进制-仔细想想)可以讨论原因。但是请记住,设置限制仅控制该空间的垃圾收集(GC)何时发生

第01组:具有所有非动态类的应用程序

该组将您置于上面提到的稳定带中。在这种情况下,要设置的大小相当容易确定(就像MaxPermSize一样),而且即使有GC,也不会有太多

第10组:具有动态类的应用程序


考虑到功能强大的第三方库的激增,该组中的几乎所有应用程序都是这样吗?通常,您并不关心库是否是Scala/Groovy/etc,它只做您想要的事情,因此可以使用它。用死(动态)类填充元空间的价值是什么?当GC真的到来时,它将是昂贵的。我宁愿限制大小,使GC更频繁(但每个GC的暂停时间更少),并且更容易在同一硬件上运行多个应用程序,而不必担心它们各自的元空间会相互碰撞。

我确实理解,默认情况下,元空间没有限制。但是现在它位于本机内存中,如果没有设置限制,则可能会消耗所有系统内存。更好的是,我的应用程序抛出OOM或系统崩溃(没有明显的原因)?通过添加MaxMetaspaceSize,当系统崩溃从来都不是一个风险时,我是否会通过OOM增加崩溃的可能性?我会设置一个最大值,该值足够大,在正常情况下不会触发。我这样说的原因是,如果本机内存耗尽或发生了随意交换,系统可能会表现得非常不稳定,难以控制。密歇根州比OOM或Java冻结更糟糕。例如,使用2GB(要求系统至少有2GB可用缓冲区)@eckes您可以将其移动到答案部分。这是一个值得考虑的问题。它不是
--XX:MaxMetaspaceSize
,而是
-XX:MaxMetaspaceSize
。在我们的一个UAT环境中,只有一个-Preced XXI存在本机内存泄漏问题。我们永远无法从这种情况中恢复,唯一的解决办法是硬重启。