JVM 类加载机制

**JVM类加载分为5个过程:加载,验证,准备,解析,初始化,使用,卸载,如何是要分三步的话为,

加载-链接-初始化

1.加载,jvm 将从不同的地方把字节码文件加载到内存中,比如.class jar包里面的,还可以从网络上加载进来,并转化成jvm 认可的数据结构,在这个阶段我们也可以实现自己的类加载器,实现特定的功能

2.链接 ,链接就是将jvm 类型的原始定义成功的转入到jvm 的执行过程中,包括,验证,准备,解析,验证表示jvm 加载进来的字节码是否符合java规范,这一步方式恶意代码被加载进来,包含jvm虚拟机。验证阶段会根据类的的依赖关系加载更多的类,准备,准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配,这时候进行内存分配的仅包括类变量(被static修饰的变量),而不包括实例变量,实例变量将会在对象实例化时随着对象一起分配在堆中。其次,这里所说的初始值“通常情况”下是数据类型的零值,假设一个类变量的定义为:

public static int value=123;

那变量value在准备阶段过后的初始值为0而不是123.因为这时候尚未开始执行任何java方法,而把value赋值为123的putstatic指令是程序被编译后,存放于类构造器()方法之中,所以把value赋值为123的动作将在初始化阶段才会行。至于“特殊情况”是指:public static final int value=123,即当类字段的字段属性是ConstantValue时,会在准备阶段初始化为指定的值,所以标注为final之后,value的值在准备阶段初始化为123而非0.
解析,解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符7类符号引用进行。

3.初始化 可以理解为各种赋值和初始化动作,静态变量,静态代码块。

jvm 加载类的方式使用的是双亲委派模型
就是jvm 在加载java类的时候,先给父类加载器过目一下,如果父类说加载不了,就由下面的类一级一级的过目,直到可以加载为止,这样做的目的是为了防止,一个类被重复加载,jre 中内置了三种类加载器,满足了大部分的业务需求,位于最顶层的是启动类加载器,扩展类加载器,应用类加载器。

启动类加载器主要加载,jre/lib 下面的jar包,
扩展类加载器主要加载,jre/lib/ext 下面的jar包
应用类加载器主要加载,classpath 下的类文件。

如下图所示:**

类加载流程.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,确实编译语言发展的一大步。 虚拟机把描述类的数据从...
    胡二囧阅读 977评论 0 0
  • 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的...
    丑人林宗己阅读 580评论 0 2
  • JVM类加载机制 概述 类加载过程 加载 通过类的全限定名获取类的二进制流 将静态存储结构转化为方法区的运行时数据...
    东溪95阅读 3,075评论 0 15
  • 所谓类加载机制,就是虚拟机把描述类的数据从Class文件加载到内存中,并对其进行校验,转换,分析以及初始化,并最终...
    登高且赋阅读 1,191评论 0 15
  • 原文地址[http://blog.csdn.net/ns_code/article/details/1788158...
    期待现在阅读 276评论 0 2