我们正在将Web应用程序从Java 7迁移到Java 8。我们已经定义了PermSize
jvm 参数参数。
由于 Java 8 将忽略此参数,因此这是没有用的。元空间是在Java 8中引入的,它的默认大小是无限的(仅限于物理内存(,并且具有动态增长。
我的问题是,我是否需要为我的 Web 应用程序找出metaspace
jvm 参数的最佳值,或者使用默认值是个好主意?
更新:
有关我的网络应用程序的更多信息: 我的 Web 应用程序基于struts
和spring
框架。通常需要4k
个请求/分钟。此应用程序部署在 tomcat 8.5 上,它不托管任何其他 Web 应用程序。但是,在同一虚拟机上运行多个 tomcat 实例。当前-Xms
和-Xmx
值设置为1g
。
这里有许多事情可以考虑:
初始元空间大小:在启动应用程序时,您是否看到负面和可衡量的影响,因为 JVM 必须调整元空间的大小?然后,您可能应该设置最小大小。我仍然会尽量避免这种情况,因为当应用程序增长时,这将是一个很容易忘记的设置。
-XX:MetaspaceSize=<NNN>
最大元空间大小:当元空间增长到特定大小时,您是否希望应用程序失败?还是要限制服务器在这方面占用的资源?然后,您可能应该为元空间设置最大大小
-XX:MaxMetaspaceSize=<NNN>
元空间自由比率:您是否动态加载许多不同的类?然后,您可以在元空间上定义一个自由比率,以便始终有足够的空间用于新类,并且在危急情况下不需要调整大小。
-XX:MinMetaspaceFreeRatio=<NNN>
和-XX:MaxMetaspaceFreeRatio=<NNN>
我的建议是坚持默认值,测试它,只在需要时做出反应。
Holger是对的。这里记录得很清楚,我可能在这里引用一下。
-XX:元空间大小=大小 设置分配的类元数据空间的大小,该空间将在第一次超出垃圾回收时触发垃圾回收。垃圾回收的此阈值根据使用的元数据量而增加或减少。默认大小取决于平台。
直接引用,但重点是我的;)
元空间的引入是通过上述动态内存增长/分配来解决Java的内存不足问题(IIRC(的一个手段。
在生产环境中,我要说的并不是那么可行,但是:尝试一下。我个人从未遇到过默认动态设置的任何问题,但我想这取决于应用程序的大小和压力。现在,假设默认设置是合适的。