天天看点

jvm内存模型jvm内存模型

jvm内存模型

jvm内存模型jvm内存模型

类加载器子系统:

  • 只负责加载class文件,至于该类是否被执行则由执行引擎所决定,每个class文件都有特定的标识,称为魔数。

    魔数:class文件以十六进制方式进行查看,第一行字母:CA FE BA BE

    该魔数表示当前class是java语言编译而成的,不同的语言编译得到的class文件的魔数都不一样

    在魔数之后20 20 20 34表示当前class文件是那个版本的JDK所编译的。这里的34等于十进制的52,52则代表JDK1.8版本。

  • 加载类的信息存放于一块方法区的空间

方法区:

  1. 方法区中存放虚拟机已加载好的所有类的信息

类信息包括:

类型信息
  • 类的全限定类名(例:java.lang.System)
  • 类的直接父类的全限定类名
  • 类的直接实现接口的有序列表(因为一个类直接实现的接口可能不止一个,因此放到一个有序列表中)
  • 类的修饰符

    可以看做是,对一个类进行登记,这个类的名字叫啥,他爹是谁,有没有实现接口,权限是啥

类型的常量池(运行时常量池)
  • 每一个class文件中,都维护着一个常量池(这个保存在类文件中,不要与方法取得运行时常量池搞混),里面存放着编译时期生成的各种字面值和符号引用;这个常量池的内容,在类加载的时候,被复制到方法区的运行时常量池。
  • 字面值:就像String,基本数据类型,以及他们的包装类的值,以及final修饰的变量,简单说就是在编译期间,就可以确定下来的值
类变量(static变量)
  • 非final类变量
  • 在JVM使用一个类之前,它必须在方法区中为每个非final类变量分配空间。非final类变量存储在定义它的类中
final类变量(不存储在方法区中),由于final的不可改变性
因此,final类变量的值在编译期间就被确定
被保存在类的常量池里面,
在加载类的时候,复制进方法区的运行时常量池
final类变量存储在运行时常量池里面,每一个使用它的类保存着一个对其的引用。