我们有一个 Jboss 应用程序,我们经常在日志中收到错误:
错误[org.jboss.threads.errors](管理任务-2)线程线程[管理任务-2,5,main]抛出了一个未捕获的异常:java.lang.OutOfMemoryError:Metaspace
JVM 的当前设置如下: JAVA_OPTS="-Xms1303m -Xmx1303m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m"
自从我们收到 java.lang.OutOfMemoryError: Metaspace 以来,我们计划增加 -XX:MaxMetaspaceSize 大小。
问题:
您问的问题是这样的:
目前我们在服务器中使用 6GB RAM,如果我们想增加 -XX:MaxMetaspaceSize 的大小,我们可以设置的最大值是多少?
Java 11 文档是这样说的:
-XX:MaxMetaspaceSize=大小
设置可分配给类元数据的最大本机内存量。 默认情况下,大小不受限制。应用程序的元数据量取决于应用程序本身、其他正在运行的应用程序以及系统上的可用内存量。
简而言之,没有理论上的最大尺寸。 实际的最大大小将与您拥有的物理 RAM 量有关。 (如果您尝试使用比物理 RAM 更多的虚拟内存,则会遇到虚拟内存抖动、OOM 杀手等问题。)
但我也认为你应该注意@Holger的建议。 您可能最好根本不设置
-XX:MaxMetaspaceSize
。 让 JVM 自动调整它的大小。
如果您担心设置或不设置该选项的效果,我们无法向您提供保证。 您需要尝试一下才能看到。
最后,在评论中你说:
我很担心...看到评论后...用户在删除此选项后说:他们在具有本机内存泄漏的 UAT 环境之一中遇到了此问题。他们永远无法从这种情况中恢复,唯一的解决方案是硬重启。
这有什么关系? 他们必须重新启动机器。 那又怎样?
由于多种原因,机器(虚拟的和物理的)需要偶尔重新启动。 如果您的关键系统无法应对这一点,那么您的组织就会出现问题......