方法区jdk1.7,1.8版本的构造变化

目录:
java虚拟机汇总

  1. class文件结构分析
    1).class文件常量池中的常量项结构
    2). 常用的属性表的集合
  2. 类加载过程
    1).类加载器的原理以及实现
  3. 虚拟机结构分析
    1).jdk1.7和1.8版本的方法区构造变化<<== 现在位置
    2).常量池简单区分
  4. 对象结构分析
    1).压缩指针详解
  5. gc垃圾回收
  6. 对象的定位方式

首先要明白方法区是一个概念(存放方法的信息),jdk1.7即以前的实现是永久代,
jdk8以及以后是元空间
jdk1.6:
jdk7以前的hotspot里面的结构有,堆。栈。永久代,程序计数器
此时的方法区,hotspot的实现是永久代

永久代(方法区)存放的内容有

  1. 类信息。。
  2. 字段。。
  3. 方法。。
  4. 静态变量和全局变量
  5. 运行时常量池(里面包含字符串常量池)
  6. Class引用
  7. ClassLoader的引用
  8. 方法表

jdk1.7:
然后在1.7版本迎来了一些改动

永久代中的静态变量和运行时常量池中的字符串常量池转移到了堆中,
也就是说全局变量和其他常量(非字符串常量)还遗留在永久代中
jdk1.8:
移除了永久代,用元空间代替(这里看出jdk7的操作是预先操作) 为什么?

  1. 字符串存在永久代中,容易出现性能问题和内存溢出
  2. 类及方法的信息等比较难确定其大小,因此对于永久代的大小指定比较困难,太小 容易出现永久代溢出,太大则容易导致老年代溢出
  3. 永久代会为 GC 带来不必要的复杂度,并且回收效率偏低
  4. 将 HotSpot 与 JRockit 合二为一
    以上是好处,稍微记忆一下,这里大家只需知道,在原来永久代的东西都被搬到了元空间,所以相对于1.7版本我们并不需要记多少东西,还依然是字符串常量池和静态变量装到了堆中,其余的装到元空间

每个Java对象的对象头里,_klass字段会指向一个VM内部用来记录类的元数据用的InstanceKlass对象;InsanceKlass里有个_java_mirror字段,指向该类所对应的Java镜像——java.lang.Class实例。HotSpot VM会给Class对象注入一个隐藏字段“klass”,用于指回到其对应的InstanceKlass对象。这样,klass与mirror之间就有双向引用,可以来回导航。
这个模型里,java.lang.Class实例并不负责记录真正的类元数据,而只是对VM内部的InstanceKlass对象的一个包装供Java的反射访问用。
在JDK 6及之前的HotSpot VM里,静态字段依附在InstanceKlass对象的末尾;而在JDK 7开始的HotSpot VM里,静态字段依附在java.lang.Class对象的末尾。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值