java基本原理-虚拟机怎么运行java字节码,java基本类型,加载java类

java 虚拟机结构

  • java虚拟机结构:
    java基本原理-虚拟机怎么运行java字节码,java基本类型,加载java类_第1张图片
    • java虚拟机加载java类后,会被存放与方法区
    • java虚拟机会将栈细分为面向java方法的java栈,面向本地(native)方法栈,存放线程执行位置的pc寄存器

运行流程

  • 在运行过程中,当调用一个java方法是,java虚拟机会在当前线程的java方法栈中生成一个栈帧
  • 当退出当前执行的方法时,java虚拟机会弹出当前线程的当前栈帧
  • 当java代码运行时,需要将字节码翻译成机器码,需要两种形式:1.解释执行,将字节码翻译成机器码,并运行。2.即时编译,将方法中包含的所有字节码编译成机器码后再执行。hotSpot默认采用混合模式,先解释执行字节码,然后将其中反复执行的热点代码以方法为单位即时编译。

java基本类型

  • java虚拟机的boolean类型

    • 在java语言中:boolean类型的值只用两种,分别为true和false,
    • 在java虚拟机中:boolean被映射成int类型,分别为1和0
  • java的基本类型
    java基本原理-虚拟机怎么运行java字节码,java基本类型,加载java类_第2张图片

  • java基本类型的大小

    • java虚拟机每调用一个java方法,会创建一个栈帧,栈帧主要分为局部变量去,和字节码的操作数栈。java虚拟机规范中,局部变量相当于一个数组,除了long,double需要两个单元存储,其他都只需要一个, 所以说除了long和double,其他类型在32位的hotSport中,这些类型在栈上占用4个字节,在64位的hotspot,占用8个字节
    • 当这些基本类型存储于堆中或者数组元素中时,对于byte,char和short类型,他们占用的空间分别为一字节,两字节
    • boolean字段和boolean,在hotspot中,boolean字段占用一个字节,而boolean数组则使用byte数组来实现

如何加载java类

java基本原理-虚拟机怎么运行java字节码,java基本类型,加载java类_第3张图片

  • 加载: 加载是虚拟机需要借助类加载器来完成查找字节流的过程
    • 类加载器:
      • 启动类加载器:所以类加载器的父类都有一个启动类加载器(bootstrap class loader) ,在java9之前启动类加载器负责加载最基础的类,比如jre lib包下面的类;
      • 扩展类加载器: 除此之外还有扩展类加载器和应用类加载器,扩展类加载器主要负责加载比如jre lib/ext目录下jar包中的类,java9之后扩展类加载器变为平台类加载器,javase中比如java base是由启动类加载器加载之外,其他模块都由平台类加载器加载
      • 应用类加载器:主要加载应用程序路径下的类。
      • 自定义类加载器:比如可以对class文件进行加密,加载时,使用自定义的类加载器对其解密
    • 双亲委派模型:每当一个类加载器接收到加载请求时,他会先将请求转发给父类加载器,在父类加载器没有找到锁请求的类的情况下,改类加载器才会去加载
  • 链接:链接是指将创建成的类合并至java虚拟机中 是它能够执行:主要分为验证,准备,解析
    • 验证:验证被加载的类是否满足java虚拟机的约束规范
    • 准备:为被加载的静态字段分配内存
    • 解析:在class文件被加载时,java编译器会生成一个符号引用,解析阶段目的是将这些符号引用解析成为实际引用。如果符号引用指向一个未被加载的类,或者未被加载类的字段或方法,解析将会触发这个类的加载
  • 初始化:类加载的最后一步是初始化,为标记常量值的字段复制,和执行clinit(java总所有静态代码块中的代码,会被java编译器置于同一方法中,命名为clinit)方法,java虚拟机会通过加锁,确保clinit方法只被执行一次

你可能感兴趣的:(jvm)