在Java 7之前,JVM内存中有一个名为PermGen的区域,JVM用于保存其类.在Java 8中,它被删除并被称为Metaspace的区域取代.
PermGen和Metaspace之间最重要的区别是什么?
我知道的唯一区别是java.lang.OutOfMemoryError: PermGen space不能再抛出并MaxPermSize忽略VM参数.
在将我们的Java应用程序(在Tomcat上运行的服务)JRE从Java 7切换到Java 8后,我们开始看到java.lang.OutOfMemoryError: Metaspace运行了几天后流量很大.
堆使用没问题.在性能测试期间执行相同的代码流之后,元空间会跳转.
可能导致元空间内存问题的原因是什么?
目前的设置是:
-server -Xms8g -Xmx8g -XX:MaxMetaspaceSize=3200m -XX:+UseParNewGC
-XX:+UseConcMarkSweepGC -XX:MaxGCPauseMillis=1000
-XX:+DisableExplicitGC -XX:+PrintGCDetails
-XX:-UseAdaptiveSizePolicy -XX:SurvivorRatio=7 -XX:NewSize=5004m
-XX:MaxNewSize=5004m -XX:MaxTenuringThreshold=12
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintFlagsFinal
-XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution
-XX:+PrintGCCause -XX:+PrintAdaptiveSizePolicy
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=3 -XX:GCLogFileSize=200M
Run Code Online (Sandbox Code Playgroud)
该应用程序也大量使用反射.我们还使用自定义类加载器.所有这些都在java 7中运行良好.