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

9
我们正在将我们的Web应用程序从Java 7迁移到Java 8。我们曾经定义了PermSize jvm参数。由于Java 8将忽略这些参数,所以它们已无作用。Java 8引入了Metaspace,其默认大小是无限的(限制于物理内存)并具有动态增长。
我的问题是,我需要找出适合我的Web应用程序的最佳值,对于metaspace jvm参数,或者使用默认值会是个好主意?
更新: 关于我的Web应用程序: 我的Web应用程序基于Struts和Spring框架。它通常每分钟处理4k个请求。该应用程序部署在Tomcat 8.5上,不托管任何其他Web应用程序。但是,在同一虚拟机上运行多个Tomcat实例。当前的-Xms和-Xmx值设置为1g。

2
那么我可以编辑我的回答:应用程序有多大,有多少用户在使用它?您是否在同一服务器上运行多个应用程序?如果您的应用程序与其他应用程序共享同一台机器,则绝对需要设置一些固定的内存上限,以防整体资源耗尽成为真正的问题。 - Wep0n
@Wep0n,我已经在我的问题中更新了我的Web应用程序。 - Rishikesh Darandale
请点击此处查看非常清晰的解释:https://gist.github.com/erikdw/e730a1249887bb4462f226658351cfa4 - Redoman
3个回答

9

这里有几个可以考虑的方面:

  1. 初始 Metaspace 大小:当 JVM 需要调整 metaspace 的大小时,您的应用程序启动时是否出现负面影响?那么你可能应该设置最小尺寸。不过我建议避免这样做,因为当应用程序增长时,这将是一个容易被忽略的设置。-XX:MetaspaceSize=<NNN>

  2. 最大 Metaspace 大小:当 metaspace 增长到特定大小时,您想让应用程序失败吗?或者您想在这方面限制服务器占用的资源吗?那么你应该为 metaspace 设置一个最大大小。-XX:MaxMetaspaceSize=<NNN>

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

我的建议是坚持使用默认值,在测试后仅在需要时才做出反应。


19
-XX:MetaspaceSize 不会设置初始大小,而是设置一个阈值,当第一次超出该阈值时会触发垃圾回收。请注意,此处的“不会设置初始大小”是原文的否定形式。 - Holger

3
Holger是对的。这在 这里 已经有明确记录,我可以引用一下:
-XX:MetaspaceSize=size 设置分配类元数据空间的大小,当第一次超过此大小时会触发垃圾回收。这个垃圾回收的阈值会根据元数据使用量的增长或者减少而调整。默认大小取决于平台。
(直接引用,但加粗部分为我所添加)

2
Metaspace的引入是为了解决Java在垃圾收集时出现的内存不足问题(如果我没记错的话),通过动态内存增长/分配来解决。在生产环境中,我要说的并不是非常可行的,但是:试一试吧。我个人从来没有遇到过默认动态设置方面的任何问题,但这取决于应用程序的大小和压力。目前,假定默认设置是适当的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接