【喜欢的话可以一键三连+关注哦~】 你的三连+关注是对我最大的支持!之后也会继续更新本专栏呦 ~~
类的生命周期
描述了一个类加载、使用、卸载的整个过程。
应用场景
经历的几个阶段
其中【初始化】阶段是最重要的。
加载阶段
1.加载阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。
程序员可以使用Java代码来拓展的不同渠道
例如:本地文件(磁盘上的字节码文件)、动态代理生成(程序运行时使用动态代理生成)、通过网络传输的类(早期的Applet技术使用)等等。
2.类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到方法区中。
方法区为虚拟的一块地方
3.类加载器在加载完类之后,Java虚拟机会将字节码中的信息保存到内存的方法区中。
生成一个InstanceKlass对象,保存类的所有信息,里边还包含实现特定功能比如多态的信息。
4.同时,Java虚拟机还会在堆中生成一份与方法区中数据类似的java.lang.Class对象。
作用:在Java代码中去获得类的信息一级存储静态字段的数据(JDK8之后)
为什么我们需要在方法区和堆区都创建一个对象?
因为:InstanceKlass是用C++编写的对象,我们java代码一般不能直接去操作这种C++语言编写的对象,所有java虚拟机就在堆上面创建java.lang.Class这种Java语言来包装之后的对象,可以让我们在代码中获取到。
java.lang.Class包含的字段少于方法区里边的InstanceKlass里的字段,那么这是为什么呢?
(1)InstanceKlass里面的信息不一定我们都会使用到,比如说有一个虚方法表是java虚拟机底层 去实现多态的时候去使用的,而对于开发者来说这些信息是完全不需要使用的。
(2)为了保证开发者访问这段数据的安全性,咱们就只能让她访问部分数据。
所有基于这样的目的咱们在堆里面又开辟了一开区域,把上面的数据复制过来,哪些数据不需要咱们就把他剔除掉,那么对于开发者来说她仅仅只需要去访问java.lang.Class这个对象,而这个对象中只包含了咱们需要用到的方法、字段这些内容。其他的内容java.lang.Class里一概不包含。对于InstanceKlass对象为了出于安全性,我们不会让去访问。
这样Java虚拟机就能很好的控制开发者访问数据的范围。