2

我最近将 java 版本从 1.6 升级到 1.8。迁移到 java 1.8 后,元空间内存消耗随着时间的推移而增加(通过 JConsole 观察到这一点)。此外,每次访问网页时,元空间大小都会增加。所以,

有什么办法可以强制清理 Metaspace?

有什么方法可以检查元空间中的所有内容并增加元空间的大小?

哪种 GC(SerialGC、G1、ConcMarkSweep)有效地清理了元空间以及我应该为 GC 使用哪些 JVM VM 配置?

正确的元空间操作所需的最小 RAM java 1.8 是多少?在我的例子中,它限制在 256M RAM,在一个微型 Linux 机器上具有相同的交换大小。

如果我们使用 XX:MaxMetaSpaceSize 限制元空间大小,JVM 会引发 outofmemory:metaspace 条件。

4

1 回答 1

1

非常感谢您的回答!

我发现Old JaxB 和 JDK8 Metaspace OutOfMemory Issue描述了与我相同的问题。

使用“ -Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true”,我能够使元空间使用稳定。

使用此选项,如果我的应用程序处于空闲状态(只是定期访问 web 服务,读取 xml 并将 xml 中的详细信息显示到我的视图层),它不再增加内存使用量,无论是 top 命令输出还是元空间(在控制台)。

但是,如果我执行任何操作(即访问网页并执行数据库操作/文件 IO 等),内存使用量就会上升。Java 1.6 也是这种情况,但在 Java 1.6 中,内存用于在 5-6 分钟内达到其正常水平。但是使用 java 1.8,需要 10-12 小时才能达到正常水平。

这是我的jvm配置:

java -Dsun.rmi.dgc.client.gcInterval=60000 -XX:NewRatio=3 - 
XX:MinHeapFreeRatio=60 -XX:MaxHeapFreeRatio=70 -Xmx64M -Xms32M -
XX:MetaspaceSize=12M -XX:+UseLargePagesInMetaspace -
XX:CompressedClassSpaceSize=10M -XX:+UseLargePages -
XX:+CMSClassUnloadingEnabled -
Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true - 
Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -
Dcom.sun.management.jmxremote.authenticate=false -
Dcom.sun.management.jmxremote.port=1099 -Dfile.encoding=UTF8 -
Dorg.apache.jasper.compiler.disablejsr199=true -Duser.timezone=$timezone -jar start.jar
于 2016-09-09T10:20:04.457 回答