【问题标题】:How to cleanup metaspace forcefully with java 1.8如何使用 java 1.8 强制清理元空间
【发布时间】:2016-09-04 07:53:06
【问题描述】:

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

有什么办法可以强制清理元空间?

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

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

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

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

【问题讨论】:

  • 你的意思是像神奇的“-uselessmemory”标志?当您设置限制时,您已经在达到限制时强制执行清理。当您依次收到OutOfMemoryError 时,这意味着没有什么需要清理的了。
  • 但是为什么没有什么需要清理的,尤其是在元空间中?如果 GC 是通过 JVM 甚至通过 Jconsole 工具执行的,堆空间有相当大的下降,但元空间几乎没有受到影响。背后的原因是什么?类加载器泄漏?如何从代码中检测到这种泄漏?
  • 是的,很可能是泄漏。这已经包含在其他 SO 问题中

标签: java garbage-collection java-8 metaspace


【解决方案1】:

非常感谢您的回答!

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

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

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

但是,如果我执行任何操作(即访问网页并执行数据库操作/文件 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    相关资源
    最近更新 更多