作者:袁韦伦世彦琬育 | 来源:互联网 | 2023-09-18 15:21
Metaspace(元空间)是java8中提出来的概念,在java7中称为永久代.都是对JVM规范中方法区的实现.不过元空间与永久代之间最大的区别在于:元空间并不存在虚拟机中,而是
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