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