如何确定java 8的Metaspace的理想大小

时间:2017-08-10 05:23:02

标签: java java-8 jvm metaspace

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

由于Java 8将忽略此参数,因此无法使用。 Metaspace是在Java 8中引入的,其默认大小是无限的(仅限于物理内存),并且具有动态增长。

我的问题是,我是否需要为metaspace jvm params找出我的网络应用程序的最佳值,否则默认使用会是一个好主意?

更新

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

3 个答案:

答案 0 :(得分:6)

您可以考虑以下几项内容:

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

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

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

  5. 我的建议是坚持默认,测试它,只有在有需要时才会做出反应。

答案 1 :(得分:2)

当谈到通过上述动态内存增长/分配进行垃圾收集时,Metaspace的引入是解决java内存不足问题(IIRC)的一个重要因素。

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

答案 2 :(得分:0)

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

  

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

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