JVM(二):jdk8废除永久代迎来元空间

jdk8废除永久代迎来元空间。

 

永久带又叫Perm区,只存在于hotspot jvm中,而且只存在于jdk7和以前的版本中,jdk8中已经完全移除了永久带,jdk8中引入了一个新的内存区域叫metaspace。html

(1)并非全部的jvm中都有永久带,ibm的j9,oracle的JRocket都没有永久带。java

(2)永久带是实现层面的东西。oracle

(3)永久带里面存的东西基本上就是方法区规定的那些东西。jvm

所以,咱们能够说,永久带是方法区的一种实现,固然,在hotspot jdk8中metaspace能够当作是方法区的一种实现。spa

 

为何要移除永久代:.net

1.移除永久代是为融合HotSpot JVM与 JRockit VM而作出的努力,由于JRockit没有永久代,不须要配置永久代htm

2.因为永久代内存常常不够用或发生内存泄露,爆出异常java.lang.OutOfMemoryError: PermGenblog

深刻理解元空间:

元空间是方法区的在HotSpot jvm 中的实现,方法区主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,可是为了与堆进行区分,一般又叫“非堆”。内存

元空间的本质和永久代相似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。,理论上取决于32位/64位系统可虚拟的内存大小。可见也不是无限制的,须要配置参数。
get

 

经常使用配置参数

1.MetaspaceSize

初始化的Metaspace大小,控制元空间发生GC的阈值。GC后,动态增长或下降MetaspaceSize。在默认状况下,这个值大小根据不一样的平台在12M到20M浮动。使用Java -XX:+PrintFlagsInitial命令查看本机的初始化参数

2.MaxMetaspaceSize

限制Metaspace增加的上限,防止由于某些状况致使Metaspace无限的使用本地内存,影响到其余程序。在本机上该参数的默认值为4294967295B(大约4096MB)。

3.MinMetaspaceFreeRatio

当进行过Metaspace GC以后,会计算当前Metaspace的空闲空间比,若是空闲比小于这个参数(即实际非空闲占比过大,内存不够用),那么虚拟机将增加Metaspace的大小。默认值为40,也就是40%。设置该参数能够控制Metaspace的增加的速度,过小的值会致使Metaspace增加的缓慢,Metaspace的使用逐渐趋于饱和,可能会影响以后类的加载。而太大的值会致使Metaspace增加的过快,浪费内存。

4.MaxMetasaceFreeRatio

当进行过Metaspace GC以后, 会计算当前Metaspace的空闲空间比,若是空闲比大于这个参数,那么虚拟机会释放Metaspace的部分空间。默认值为70,也就是70%。

5.MaxMetaspaceExpansion

Metaspace增加时的最大幅度。在本机上该参数的默认值为5452592B(大约为5MB)。

6.MinMetaspaceExpansion

Metaspace增加时的最小幅度。在本机上该参数的默认值为340784B(大约330KB为)。