如何使用java 1.8

时间:2016-09-04 07:53:06

标签: java garbage-collection java-8 metaspace

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

有什么方法可以强行清理Metaspace吗?

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

哪个GC(SerialGC,G1,ConcMarkSweep)有效清理Metaspace&我应该为GC使用哪些JVM VM配置?

对于正确的元空间操作,java 1.8需要的最小RAM是多少?就我而言,它仅限于256M RAM,在微型Linux机箱上具有相同的交换大小。

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

1 个答案:

答案 0 :(得分: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