在对java jvm进行性能监控时,发现了两个新名词Meta space和compressed class space ,通过查阅一些资料下面进行一下总结。

Meta space


元空间(metaspace)这是在java8才出现的新概念,在java6中堆结构如下图:

这里写图片描述

持久代中存的内容
1. JVM中类的元数据在Java堆中的存储区域。
2. Java类对应的HotSpot虚拟机中的内部表示也存储在这里。
3. 类的层级信息,字段,名字。
4. 方法的编译信息及字节码。
5. 变量
6. 常量池和符号解析
GC是可以对持久代进行垃圾收集的
然而在java8中把持久代(Permanent Generation)移除了替代品就是元空间(Meta space)
元空间的特点:

  • 充分利用了Java语言规范中的好处:类及相关的元数据的生命周期与类加载器的一致。
  • 每个加载器有专门的存储空间
  • 只进行线性分配
  • 不会单独回收某个类
  • 省掉了GC扫描及压缩的时间
  • 元空间里的对象的位置是固定的
  • 如果GC发现某个类加载器不再存活了,会把相关的空间整个回收掉

下图是JVM是如何给元数据分配虚拟内存的空间的

这里写图片描述

你可以看到虚拟内存空间是如何分配的(vs1,vs2,vs3) ,以及类加载器的内存块是如何分配的。CL是Class Loader的缩写。
说了这么多,如果不理解的话,一句话就是优化了性能


Compressed class space


先看一副图:

这里写图片描述

JVM中,每个对象都有一个指向它自身类的指针,不过这个指针只是指向具体的实现类,而不是接口或者抽象类。

对于32位的JVM:

_mark : 4字节常量

_klass: 指向类的4字节指针 对象的内存布局中的第二个字段( _klass,在32位JVM中,相对对象在内存中的位置的偏移量是4,64位的是8)指向的是内存中对象的类定义。

64位的JVM:

_mark : 8字节常量

_klass: 指向类的8字节的指针
对于64位平台,为了压缩JVM对象中的_klass指针的大小,引入了类指针压缩空间(Compressed Class Pointer Space)。
就是为了省内存
看下面这幅图就秒懂了:

这里写图片描述

OK到这里这两个概念应该理解了

注:本文一些内容粘贴自Java 8 的元空间
这里图片看不出,阅读起来比较困难,所以进行一个总结

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐