【JVM】类加载器

目录

 

JVM体系结构

java类的三种状态

java类的生命周期

类加载器

分类:

源码:

双亲委派加载机制


JVM体系结构

【JVM】类加载器_第1张图片

 

java类的三种状态

SOURCE:源码状态(静态)

CLASS:二进制字节码文件状态(静态)

RUNTIME:运行时状态(加载到JVM中的状态)

【JVM】类加载器_第2张图片

从CLASS——RUNTIME的过程需要类加载器

 

java类的生命周期

【JVM】类加载器_第3张图片

当程序使用某个类,如果该类还未被加载到内存中,则系统会通过加载、连接、初始化三个步骤来对该类进行初始化。如无意外,JVM会连续完成这三个步骤,所有有时也成为类加载或类初始化。 

【JVM】类加载器_第4张图片

【JVM】类加载器_第5张图片

类加载:
将类的class文件读入内存,并为之创建一个java.lang.Class对象,也就是说,当程序使用任何类时,系统都会为之创建一个java.lang.Class对象。

系统中所有类实际上也是对象,他们都是java.lang.Class的实例

由类加载器完成的。

【JVM】类加载器_第6张图片

类的连接:
连接负责把类的二进制数据合并到JRE中,分为3阶段:

  • 验证:验证阶段用于检验被加载的类是否有正确的内部结构,并和其他类协调一致(确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全)

        文件格式验证、元数据验证、字节码验证、符号引用验证

  • 准备:类准备阶段则负责为类的类变量分配内存,并设置默认初始化

        为类变量(static修饰的变量)分配内存并设置类变量初始值(通常情况下数据类型的值为0)的阶段,这些变量所使用的内存都将在方法区中进行分配。不包括实例变量(实例变量在对象实例化时随着对象一起分配在Java堆中)

 

  • 解析:将类的二进制数据中的符号引用替换成直接引用

类的初始化:
主要对类变量或其他资源进行初始化。

【JVM】类加载器_第7张图片

 

类加载器

类加载器:ClassLoader
将类的class文件读入内存,并为之创建一个java.lang.Class对象

分类:

【JVM】类加载器_第8张图片

【JVM】类加载器_第9张图片

 

源码:

【JVM】类加载器_第10张图片

双亲委派加载机制

        某个特定的类加载器在接到加载类的请求时,首先将加载任务委派给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。

特点:

  • 父类能加载的不给子类加载;
  • 这个类加载过,就不能再加载。

优点:

  • 自带优先级;
  • 是一种安全机制,程序安全是JDK的事(程序员写了不安全的程序,JDK有责任不让他运行),文件安全是系统的事;如果自己写了一个java.lang.Object的类,将不会被加载运行

 

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