JVM永久带和元空间
JVM的内存划分如下图,在JDK1.8版本废除了永久代,替代的是元空间,元空间与永久代类似,都是对方法区的实现,他们最大的区别是:Metaspace使用的是本地内存而不是JVM内存。也就是默认情况下Metaspace的大小只与本地内存大小有关。
这两个参数来指定元空间的大小:-XX:MetaspaceSize,初始空间大小,-XX:MaxMetaspaceSize,最大空间,默认是没有限制的。
其实移出永久代的工作从JDK1.7就开始了,JDK1.7中,存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap。但永久代仍存在于JDK1.7中,并没完全移除,譬如符号引用(Symbols)转移到了native heap;字面量(interned strings)转移到了java heap;类的静态变量(class statics)转移到了java heap。
为什么要废除永久代?
移出永久代是为了融合HotSpot JVM与JRockit VM(新JVM技术)而做出的改变,因为JRockit没有永久代。