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

原创 2016年06月02日 10:14:15

在对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 王晨

JDK8引进的JVM参数变化记录

1.PermGen空间被移除了,取而代之的是Metaspace 需要做的调整为-XX:PermSize=64m -XX:MaxPermSize=128m 变成 -XX:MetaspaceSize=6...

java heap space tomcat6 内存溢出

  • 2013年11月14日 17:01
  • 182KB
  • 下载

解决Java_heap_space问题

  • 2011年05月06日 13:34
  • 135KB
  • 下载

Java8内存模型—永久代(PermGen)和元空间(Metaspace)

Java8内存模型—永久代(PermGen)和元空间(Metaspace)

解决Java_heap_space问题

  • 2013年01月06日 15:44
  • 127KB
  • 下载

Java heap space 解决方法

  • 2008年12月10日 21:46
  • 519B
  • 下载

Java8内存模型—永久代(PermGen)和元空间(Metaspace)

转自:http://www.cnblogs.com/paddix/p/5309550.html

Java 8的元空间(metaspace)

很多开发者都在其系统中见过“java.lang.OutOfMemoryError:PermGenspace”这一问题。这往往是由类加载器相关的内存泄漏以及新类加载器的创建导致的,通常出现于代码热部署时...
  • xu1314
  • xu1314
  • 2016年12月28日 17:35
  • 516
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java8 Non-Heap 中的metaspace 和compressed class space解释
举报原因:
原因补充:

(最多只允许输入30个字)