java jvm 日记(一)

(一)类加载在子系统

    • 1)加载
    • 2)链接
      • 1 验证
      • 2 准备
      • 3解析
    • 3)初始化
    • 双亲委派机制
    • 加载器
    • 程序加载到运行的图(简)

类加载子系统负责从文件系统或者网络中加载class 文件 class 文件在文件头有特定的标识。类加载器只负责将class文件加载以至于到底能不能运行由执行引擎决定,加载的类信息存放在一块叫做方法区的内存空间(元数据区),除了类的信息方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量

1)加载

1)获得类的全限定名 获取类的二进制流
2)将这个字节流所代表的静态存储结构转化为方法区运行时数据结构
3)加载到能存并且声称java.lang.class对象 作为方法区 提供访问的接口

2)链接

1 验证

验证主要是是对类的二进制流验证 正确性 防止恶意文件的加载
主要验证:1 元数据验证 2 文件格式验证 3字节码验证 4符号验证

2 准备

准备阶段主要是为了给类的变量赋值 (初始) 所以 全局变量可以不用定义的时候赋值 在这里虚拟机给赋值
其中 final static 修饰的变量这里不赋值 因为在编译期间 已经赋值 其局部变量信息会进入到方法区而实例变量会随着对象进入堆中

3解析

这里主要解析常量池字符在转化为直接引用(因为类加载的时候会有多其他的方法一起加载到虚拟)这里用符合代替 反编译class 的时候会有 一个constant pool 的 区域这里由 很多 #3 之类的符号 后边是引用的直接地址 指针 也可能是另一个符号指向

3)初始化

就是构造器初始化 如果 存在 static 或者 静态代码块 会由clinit 的过程 然后之后init

双亲委派机制

即把请求交给父类加载层层提交直到没有父类 然后查找引用的类 (沙箱保护机制)这样可以防止我们创建相同路径相同名称的类被加载到内存造成错误 也防止恶意破坏代码 如果父类没有加载到会下放到子类查找直到 系统类加载器加载 我们写代码

加载器

引导类加载器《-扩展类加载器《-系统类加载器

程序加载到运行的图(简)

java jvm 日记(一)_第1张图片

你可能感兴趣的:(jvm,java)