JVM知识整理

基于《深刻理解java虚拟机》类加载过程整理java

  • 1  加载class类
  •          ①根据类的全限定名获取二进制字节流
  •          ② 将字节流表明的静态存储结构转化为方法区(元空间)运行时时数据结构
  •           ③在内存中生成一个class对象
  • 2 验证
  •           1)元数据验证
               ①验证是否实现父类或者接口的方法
               ②验证该类是否有该属性和该方法
               ③有没有final修饰的类被继承了
              
           2) 符号引用验证
                1 根据全限定名是否能够找该类(在项目打包或者打补丁的时候有可能会漏掉某个类)
                2 符号引用中的类的字段、方法在能够被当前类访问
                (有可能字段、方法以前是能够访问,后来被private,而后其余引用类没有改回来)
  • 3 准备
  •           为类变量(静态变量,静态变量之间的初始化顺序是从上往下)分配内存空间,并为八基本类型的类变量赋默认值,引用类型变量的默认值是null,若是是被final修饰的变量则直接复制,常量也会在这个阶段初始化并赋值
  • 4 解析
  •          将符号引用解析是直接引用,在方法调用是目标方法在class文件中都是给常量池的符号引用,在解析过程就把这个符号引用解析成直接引用
  •         符号引用和直接引用
  •               符号引用:用一组符号来描述引用的目标
  •               直接引用:直接指向目标的指针、相对偏移量、间接定位目标的句柄
  • 5 初始化
  •         对象实例化

注意:加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。 数据结构

动态加载?spa

     类加载器线程

       1 启动类加载器(Bootstrap ClassLoader):有C++语言实现,负责加载AVA_HOME/lib文件夹的类,或者被Xbootclasspath参数指定的路径中的类指针

       2 扩展类加载器(Extension ClassLoader),java语言实现,负责加载JAVA_HOME/lib/ext文件夹下的类对象

       3 应用程序加载器(Application ClassLoader):sun.misc.Launcher$AppClassLoader,负责加载classpath路径的类继承

    双亲委派模型接口

       双亲委派模型是每一个类加载器(除了顶级加载器--启动类加载器)收到类的加载请求,首先不是本身去查找加载该类,而是委派给父类,每一层的类加载器都是如此,知道顶级类加载器,只有当顶级类加载器反馈本身也找不到该类,子类才尝试本身加载该类内存

内存模型同步

     分主内存和线程的工做内存

           1 线程先从内存复制一份变量的副本,而后变量的写操做在线程的工做内存中完成,当线程执行完毕则将内存中变量副本的值更新下到主内存中

           注意:线程与线程是互相独立,线程不能直接访问其余线程工做内存的变量

          volatile是保证内存的可见性在于两点

               ①线程每次使用该变量前都是去主内存刷新一次

              ② 线程每次修改变量,都会当即同步到主内存

相关文章
相关标签/搜索