7

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

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

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

更新

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

4

3 回答 3

9

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

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

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

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

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

于 2017-08-10T09:14:56.720 回答
2

当涉及到通过上述动态内存增长/分配进行垃圾收集时,元空间的引入是为了解决 java 的内存不足问题 (IIRC)。

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

于 2017-08-10T05:29:38.787 回答
2

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

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

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

于 2019-05-21T06:01:46.963 回答