【JVM】——类的生命周期——应用场景和加载阶段

本文详细阐述了Java类的加载、初始化和卸载过程,重点介绍了初始化阶段,涉及类加载器如何获取字节码、方法区和堆区中Class和InstanceKlass对象的创建,以及为何在两个区域都存储数据及其安全性的考虑。
摘要由CSDN通过智能技术生成
【喜欢的话可以一键三连+关注哦~】 你的三连+关注是对我最大的支持!之后也会继续更新本专栏呦 ~~

类的生命周期

描述了一个类加载、使用、卸载的整个过程。

应用场景

经历的几个阶段

其中【初始化】阶段是最重要的。

加载阶段

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虚拟机就能很好的控制开发者访问数据的范围。

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值