元空间(Metaspace)是JDK 8引入的,用来替代永久代。它的主要作用是存储类加载器及类信息(如类的元数据)等数据。
元空间的作用是:
- 存储类加载器及定义在方法区的类型信息,替代永久代。
- 元空间位于本地堆内存,不在Java堆内存管理下,避免PermGen空间不足引起的Full GC。
- 元空间的大小仅受本地堆内存限制,默认无最大值限制。
- 我们可以使用-XX:MaxMetaspaceSize来设置元空间最大值。
- 类卸载不会使元空间大小减小,这需要重启JVM。
和永久代相比,元空间具有以下优点:
- 不会引起Full GC,避免 PermGen空间不足引起的GC停顿。
- 大小Flexible,可扩展到本地堆内存上限。
- 适用于动态生成大量短暂类的场景。
我们来看一个简单示例:
public class MetaSpaceDemo {
public static void main(String[] args) {
for (int i = 0; i < 100000; i++) { // 构建10w个class
new MetaSpaceClass();
}
}
}
class MetaSpaceClass {}
运行该示例不会抛出OOM,这是因为元空间大小很大,足以容纳10w个类信息。
如果我们配置:
-XX:MaxMetaspaceSize=10M
然后运行,程序同样不会抛出OOM,这是因为元空间不会引起Full GC。
所以,理解元空间可以让我们更好的判断类信息在内存中的分配和管理。