JVM内存结构

简图:
image.png

稍详细图:
image.png

类加载器和类加载过程

  • 类加载器负责从文件系统或网络中加载Class文件,Class文件开头有特定文件标识
  • ClassLoader只负责Class文件的加载,至于它是否可以运行,有ExecutionEngine决定
  • 加载的类信息防止方法区的内存空间,初类信息外,方法区还存放运行时的常量池信息

image.png

  • 加载
    • 通过类的全类名获取定义此类的二进制字节流
    • 将字节流代表的静态纯粹结构转化为方法区的运行时数据结构,在内存生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
    • 加载.class的方式
        1. 从本地文件系统加载
      • 2.通过网络加载
      • 3.从zip压缩包读取,是jar、war格式的基础
      • 4.运行时计算生成,如动态代理技术
      • 5.其他文件生成,如JSP
      • 6.从专属数据库中提取.class,较少见
      • 7.从加密文件中获取,如反编译的保护措施
  • 链接
    • 验证:主要验证字节码是否符合当期虚拟机要求,保证被家长类的正确性。主要为:文件格式验证、元数据验证、字节码验证、符号引用验证。
    • 准备:
      • 为类变量分配内存并设置初始值,即零值
      • final修饰的static在编译时就分配值了,准备阶段会显示初始化
      • 这里不会为示例变量分区初始化,类变量分配在方法区,示例变量随对象分区到堆内存
    • 解析
      • 将常量池内的符号引用转为直接引用的过程
  • 初始化