元空间(Metaspace)内存分配模型。现在大多数的类元数据分配在本地化内存中。我们用来描述类的元数据的klasses已经被移除。
元空间的容量默认情况下,类元数据分配受到可用的本机内存容量的限制(容量依然取决于你使用32位JVM还是64位操作系统的虚拟内存的可用性)。
一个新的参数 (MaxMetaspaceSize)可以使用。允许你来限制用于类元数据的本地内存。如果没有特别指定,元空间将会根据应用程序在运行时的需求动态设置大小。
元空间的垃圾回收
如果类元数据的空间占用达到参数“MaxMetaspaceSize”设置的值,将会触发对死亡对象和类加载器的垃圾回收。
为了限制垃圾回收的频率和延迟,适当的监控和调优元空间是非常有必要的。元空间过多的垃圾收集可能表示类,类加载器内存泄漏或对你的应用程序来说空间太小了。
java堆空间的影响一些各种各样的数据已经转移到Java堆空间。这意味着JDK8升级后,您可能会发现Java堆空间的不断增加。
元空间监控元空间的使用从HotSpot 1.8开始有详细的GC日志输出。在我们基于B75测试的时候Jstat 和JVisualVM还没有升级, 目前还是引用到老的永久代空间。现在有足够的理论,我们可以通过我们的Java程序泄漏的行为来观察我们的这个新的内存空间...
永久代和元空间运行时对照:为了更好的理解新的元空间运行时的行为特征,我们创建一个类元数据泄露的java程序,你可以在这里下载源代码:
我们测试下面的场景:
使用JDK 1.7运行java程序,并且为了监控和耗尽永久代内存空间,将其设置为128MB
使用JDK1.8(B75)运行java程序,并且监控新的元空间内存的冬天增长和垃圾回收。
使用JDK1.8(B75)运行