元空间是永久代的替代品
从JDK1.8开始正式取消了永久代之后,取而代之的就是元空间(MetaSpace),所谓的元空间的本质指的是本机物理内存,其作用和永久代相同。不过元空间和永久代有很大的区别:元空间用的是物理内存(受到本机的物理内存的限制),而永久代是JVM的内存空间,本身受到JVM的限制。两者作用是一样的,都是保存那些基本上不会被清空的操作的,比如字符串常量池。
元空间的调整参数
- -XX:MetaspaceSize 设置元空间的初始大小
- -XX:MaxMetaspaceSize 设置元空间的最大容量,默认是没有限制的(受本机物理内存限制)
- -XX:MinMetaspaceFreeRatio 执行GC之后,最小的剩余元空间百分比,合理的值可以减少为分配空间导致的垃圾收集
- -XX:MaxMetaspaceFreeRatio 执行GC之后,最大的Metaspace剩余空间容量的百分比,合理的值可以减少为释放空间导致的垃圾收集
如果元空间内存不够,会报“OutOfMemoryError:Metaspzace”。
有一个关于OOM的面试题:请问是否知道什么叫OOM?怎么会出现?
OutOfMemoryError指的是内存溢出问题,内存的溢出需要考虑以下的情况:
|- Java堆内存溢出(Java head space):往往出现在Full GC失败之后;
|- 永久代(PermGen space):分配的内存不足,或者数据量高于内存;
|- 元空间(Metaspace):分配的物理内存不足,或者数据量高于物理内存。