Metaspace(元空间)是java8中提出来的概念, 在java7中称为永久代. 都是对JVM规范中方法区的实现. 不过元空间与永久代之间最大的区别在于: 元空间并不存在虚拟机中, 而是使用本地内存. 因此默认的情况下, 元空间的大小仅仅受本地内存的限制.
- 查看默认的元空间大小 在任意目录下, 执行如下的命令 , 查看所有的全局参数
java -XX:+PrintFlagsFinal -version
可以看到默认的MetaspaceSize 为21807104 , 大约为21M. 如果反复的创建对象, 那么就会导致元空间的内存溢出. 那么可以把元空间配置的大一些.
uintx MetaspaceSize = 21807104 {pd product}
还是使用以下的代码作为实例.
public class MyHelloGc {
public static void main(String[] args) throws InterruptedException {
System.out.println("***************HELLO GC");
Thread.sleep(Integer.MAX_VALUE);
}
}
运行上面的代码, 不做任何jvm参数的修改, 查看默认的元空间的大小. 可以查看到默认的元空间的大小为20M左右. 通过
-XX:+PrintCommandLineFlags
参数, 查看默认的参数大小. 运行后,控制台打印如下
-XX:InitialHeapSize=199428288 -XX:MaxHeapSize=3190852608
-XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers
-XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation
-XX:+UseParallelGC
***************HELLO GC
再给程序配置如下的jvm参数. 初始内存为128m, 最大内存为4个G, 初始栈的大小为1024k, 元空间为512M, 打印出GC回收的细节. UseSerialGC代表使用串行回收器. XX:+PrintCommandLineFlags 参数用于打印jvm的相关参数 . -Xms128m -Xmx4096m -Xss1024k -XX:MetaspaceSize=512m -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseSerialGC
配置完上面的参数后, 再次运行程序 , 可以看到控制台输出如下信息. 可以看到初始化堆内存大小, 最大堆内存大小, 元空间大小-XX:MetaspaceSize=536870912
都发生了变化 . 垃圾回收器也发生了变化.
-XX:InitialHeapSize=134217728 -XX:MaxHeapSize=4294967296
-XX:MetaspaceSize=536870912 -XX:+PrintCommandLineFlags
-XX:+PrintGCDetails -XX:ThreadStackSize=1024
-XX:+UseCompressedClassPointers -XX:+UseCompressedOops
-XX:-UseLargePagesIndividualAllocation -XX:+UseSerialGC
***************HELLO GC