java.lang.OutOfMemoryError:从Java 7迁移到Java 8后出现Metaspace错误

Val*_*han 4 java out-of-memory java-8

升级后我们得到了OutOfMemoryError.JVM设置与Java 7保持一致,工作正常.

以下是Jboss 4.2服务器中的设置:

-server -Dsun.rmi.dgc.client.gcInterval = 3600000 -Dsun.rmi.dgc.server.gcInterval = 3600000 -Xms4096m -Xmx7168m -XX:MaxMetaspaceSize = 512m -XX:+ UseConcMarkSweepGC -XX:+ CMSClassUnloadingEnabled -Djava.security .egd =文件:///开发/ urandom的

只有Java 7中的差异是XX:MaxMetaspaceSize = 512m被PermGen max替换.

我想知道为什么它需要更多的Metaspace进行类加载,因为服务器和应用程序是相同的,只有Java版本的更改.

hen*_*rik 5

你应该-XX:MaxMetaspaceSize=512m完全删除.

我的猜测是,在Java 7中,您需要增加永久生成才能完全运行,因为默认最大值太低.

在Java 8中,默认情况下,保存类的元空间可以不受限制地扩展,因此您可能不会遇到首先尝试解决Java 7的问题.相反,正如您所经历的那样,您遇到了另一个问题:设置太低的元空间限制.删除所述限制可能会解决问题并允许JVM为您做出合适的决定.

另见这个答案.


Vla*_*lov 2

我想到的一件事是 java8 使用 lambda,每个 lambda 都是 java 8 中的某种类。如果我错了,请纠正我,但这就是我在创建 java8 应用程序的类图时检查到的内容。因此java8使用更多的类内存。