如何确定 java 8 元空间的理想大小

How to determine the ideal size for an Metaspace for java 8

我们正在将 Web 应用程序从 Java 7 迁移到 Java 8。我们已经定义了 PermSize jvm 参数。

因为Java8会忽略这个参数,所以这个是none的用处。 Metaspace 在 Java8 中被引入,它的默认大小是无限的(限于物理内存)并且动态增长。

我的问题是我是否需要为 metaspace jvm 参数找出我的 Web 应用程序的最佳值,或者使用默认值是个好主意?

更新:

关于我的网络应用程序的更多信息: 我的 Web 应用程序基于 strutsspring 框架。通常需要 4k requests/min。此应用程序部署在 tomcat 8.5 上,它不托管任何其他 Web 应用程序。但是,在同一个虚拟机上有多个 tomcat 个实例 运行。当前 -Xms-Xmx 值设置为 1g.

Metaspace 的引入是为了解决 java 的内存不足问题 (IIRC),当涉及到上述动态内存 growth/allocation 的垃圾回收时。

在生产环境中,我要说的并不是那么可行,而是:尝试一下。我个人从未对默认动态设置有任何问题,但我想这将取决于应用程序的大小和压力。现在,假设默认设置是合适的。

这里有很多你可以考虑的事情:

  1. 初始元space 大小:由于 JVM 必须调整元space 的大小,您在启动应用程序时是否看到负面和可衡量的影响?那么你应该设置最小尺寸。我仍然会尽量避免这种情况,因为随着应用程序的增长,这种设置很容易被遗忘。 -XX:MetaspaceSize=<NNN>

  2. 最大元space 大小:您是否希望您的应用程序在元space 增长到特定大小时失败?或者你想限制服务器在这方面占用的资源?那么你应该为 metaspace -XX:MaxMetaspaceSize=<NNN>

  3. 设置一个最大大小
  4. Metaspace 免费比率:您是否动态加载许多不同的 类?然后你可以在 metaspace 上定义一个自由比率,这样新的 类 总是有足够的 space 可用,并且在关键情况下不需要调整大小。 -XX:MinMetaspaceFreeRatio=<NNN>-XX:MaxMetaspaceFreeRatio=<NNN>

我的建议是坚持默认设置,对其进行测试,仅在需要时才做出反应。

霍尔格是对的。它有明确的记录 here,我可以在这里引用它。

-XX:MetaspaceSize=size Sets the size of the allocated class metadata space that will trigger a garbage collection the first time it is exceeded. This threshold for a garbage collection is increased or decreased depending on the amount of metadata used. The default size depends on the platform.

直接引用但重点是我的;)