Jdk8-从持久代到metaspace

了解持久代

持久代作用:持久代是在方法区(静态区)中,用以加载和存放class文件,存放类信息。
常量池与持久代:jdk7开始,常量池已经不在持久代之中进行分配了,而是移到了堆中。
持久代内存获取:持久代因为是方法区的一部分,所以其占用的内存是从jvm内存中获取的

持久代移除过程

1.7之前 常量池存在于方法区(持久代)
1.7 常量池从方法区移到堆中
1.8 移除持久代,设置metaspace

持久代被移除的原因:

  • hotspot为了和JRockit进行融合而做的努力,因为JRockit用户并不需要配置持久代(因为JRockit就没有持久代)。
  • 类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小容易出现永久代溢出,太大则会占用jvm的内存,容易导致老年代溢出;而metaspace直接使用本地内存
  • 永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。 

解决方案

取消持久代,增加Metaspace,那么metaSpace有什么好处?
Metaspace并不在虚拟机内存中而是使用本地内存,所以metaspace变大时,不会占用jvm内存,不会导致oom问题

metaspace的参数设置

-XX:MetaspaceSize=*m:初始化的Metaspace大小
-XX:MaxMetaspaceSize=*m:限制Metaspace增长的上限,本机上该参数的默认值为4294967295B(大约4096MB)。
-XX:MinMetaspaceFreeRatio=40:当进行过Metaspace GC之后,会计算当前Metaspace的空闲空间比,如果空闲比小于这个参数(即实际非空闲占比过大,内存不够用),那么虚拟机将增长Metaspace的大小。默认值为40,也就是40%。
-XX:MaxMetasaceFreeRatio=70:当进行过Metaspace GC之后, 会计算当前Metaspace的空闲空间比,如果空闲比大于这个参数,那么虚拟机会释放Metaspace的部分空间。默认值为70,也就是70%。
-XX:MaxMetaspaceExpansion=**m:Metaspace增长时的最大幅度。在本机上该参数的默认值为5452592B(大约为5MB。
-XX:MinMetaspaceExpansion=**m:Metaspace增长时的最小幅度。在本机上该参数的默认值为340784B(大约330KB)。

Metaspace 垃圾回收

对于僵死的类及类加载器的垃圾回收将在元数据使用达到“MaxMetaspaceSize”参数的设定值时进行。
适时地监控和调整元空间对于减小垃圾回收频率和减少延时是很有必要的。持续的元空间垃圾回收说明,可能存在类、类加载器导致的内存泄漏或是大小设置不合适。

你可能感兴趣的:(jvm,深入理解java虚拟机)