Java8 Non-Heap 中的metaspace 和compressed class space解释 - Go语言中文社区

Java8 Non-Heap 中的metaspace 和compressed class space解释


在对java jvm进行性能监控时,发现了两个新名词Meta spacecompressed class space ,通过查阅一些资料下面进行一下总结。
元空间(metaspace)这是在java8才出现的新概念,在java6中堆结构如下图:
这里写图片描述
持久代中存的内容
1. JVM中类的元数据在Java堆中的存储区域。
2. Java类对应的HotSpot虚拟机中的内部表示也存储在这里。
3. 类的层级信息,字段,名字。
4. 方法的编译信息及字节码。
5. 变量
6. 常量池和符号解析
GC是可以对持久代进行垃圾收集的
然而在java8中把持久代(Permanent Generation)移除了替代品就是元空间(Meta space)
元空间的特点:

  1. 充分利用了Java语言规范中的好处:类及相关的元数据的生命周期与类加载器的一致。
  2. 每个加载器有专门的存储空间
  3. 只进行线性分配
  4. 不会单独回收某个类
  5. 省掉了GC扫描及压缩的时间
  6. 元空间里的对象的位置是固定的
  7. 如果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 的元空间
这里图片看不出,阅读起来比较困难,所以进行一个总结

author 王晨

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/jijijijwwi111/article/details/51564271
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-28 01:18:48
  • 阅读 ( 971 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢