Jvm的metadata和compressed class space含义
在对java jvm进行性能监控时,发现了两个新名词Meta space和compressed class space ,通过查阅一些资料下面进行一下总结。Meta space元空间(metaspace)这是在java8才出现的新概念,在java6中堆结构如下图:持久代中存的内容1. JVM中类的元数据在Java堆中的存储区域。2. Java类对应的HotSpot虚拟机中的内...
在对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 的元空间
这里图片看不出,阅读起来比较困难,所以进行一个总结
更多推荐
所有评论(0)