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



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

由于 Java 8 将忽略此参数,因此这是没有用的。元空间是在Java 8中引入的,它的默认大小是无限的(仅限于物理内存(,并且具有动态增长。

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

更新

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

这里有许多事情可以考虑:

初始元空间
  1. 大小:在启动应用程序时,您是否看到负面和可衡量的影响,因为 JVM 必须调整元空间的大小?然后,您可能应该设置最小大小。我仍然会尽量避免这种情况,因为当应用程序增长时,这将是一个很容易忘记的设置。-XX:MetaspaceSize=<NNN>

  2. 最大元空间大小
  3. :当元空间增长到特定大小时,您是否希望应用程序失败?还是要限制服务器在这方面占用的资源?然后,您可能应该为元空间设置最大大小-XX:MaxMetaspaceSize=<NNN>

  4. 元空间自由比率:您是否动态加载许多不同的类?然后,您可以在元空间上定义一个自由比率,以便始终有足够的空间用于新类,并且在危急情况下不需要调整大小。-XX:MinMetaspaceFreeRatio=<NNN>-XX:MaxMetaspaceFreeRatio=<NNN>

我的建议是坚持默认值,测试它,只在需要时做出反应。

Holger是对的。这里记录得很清楚,我可能在这里引用一下。

-XX:元空间大小=大小 设置分配的类元数据空间的大小,该空间将在第一次超出垃圾回收时触发垃圾回收。垃圾回收的此阈值根据使用的元数据量而增加或减少。默认大小取决于平台

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

元空间的引入是通过上述动态内存增长/分配来解决Java的内存不足问题(IIRC(的一个手段。

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

最新更新