参考文章
jdk8之后的HotSpot JVM将永久代取出, 取而代之的是Meta Space(元空间)
为什么被移出HotSpot JVM?
1.由于 PermGen 内存经常会溢出,引发恼人的 java.lang.OutOfMemoryError: PermGen,因此 JVM 的开发者希望这一块内存可以更灵活地被管理,不要再经常出现这样的 OOM
2.移除 PermGen 可以促进 HotSpot JVM 与 JRockit VM 的融合,因为 JRockit 没有永久代。
PermGen何去何从?
- 方法区移至 Metaspace
- 字符串常量移至 Java Heap
- JDK 8 开始把类的元数据放到本地堆内存(native heap)中,这一块区域就叫 Metaspace,中文名叫元空间
使用本地内存的优点
OOM问题将不复存在,因为默认的类的元数据分配只受本地内存大小的限制.
不过应该适当限制 Metaspace 的大小: 使用 -XX:MaxMetaspaceSize
参数来指定 Metaspace 区域的大小. JVM 默认在运行时根据需要动态地设置 MaxMetaspaceSize 的大小.
除此之外,它还有以下优点
- Take advantage of Java Language Specification property : Classes and associated metadata lifetimes match class loader’s
- Linear allocation only
- No individual reclamation (except for RedefineClasses and class loading failure)
- No GC scan or compaction
- No relocation for metaspace objects
GC行为
如果Metaspace的空间占用达到了设定的最大值,那么就会触发GC来收集死亡对象和类的加载器。根据JDK 8的特性,G1和CMS都会很好地收集Metaspace区(一般都伴随着Full GC).
为了减少垃圾回收的频率及时间,控制吞吐量,对Metaspace进行适当的监控和调优是非常有必要的。如果在Metaspace区发生了频繁的Full GC,那么可能表示存在内存泄露或Metaspace区的空间太小了。
What's New?
- 新增加了几个jvm参数
- 监测工具可以监测到Meta Space的实时状态
网友评论