来捋一捋java基础(二)

上一篇说到了static final,接下来说说类加载

类的加载是指将类的.class文件中的二进制数据读取到内存中,放在了运行时数据区的 方法区,然后在区创建一个java.lang.class对象,用来封装类在方法区内的数据结构。类加载的最终产品是位于堆中的class对象,这个对象封装了类在方法区中的数据结构,并提供了访问方法区的数据结构接口。

类的生命周期,加载、验证、准备、解析、初始化五个阶段加载

  1. 加载    主要是讲class文件中的二进制字节流读到JVM中,主要完成三件事:
    1. 通过类的全限定名获取到二进制字节流
    2. 将字节流所代表的静态存储结构转化为方法区的运行时数据结构
    3. 生成一个对象,作为数据访问入口
  2. 验证  确保被加载类的正确性。(可以用-Xverifnone参数来关闭大部分的验证)
    1. 文件格式验证(是否符合Class文件格式规范)
    2. 元数据验证(是否符合java语言规范)
    3. 字节码验证(确定程序语义是合法的、符合逻辑的)
    4. 符号引用验证(确保解析动作能正确执行)
  3. 准备  为类的静态变量分配内存,并将其初始化为默认值
    1. 进行内存分配的时候仅包括类变量(static),而不包括实例变量。实例变量会随着对象的实例化分配到堆中
    2. 数据类型的默认值一般都是0L,0,null等,不是代码中附的值。举个例子,static int value = 3;在准备过后的初始值是0,而把值赋为3的时候是在编译后存放在<clinit>方法中,所以他在初始化的时候才会去赋值(注意:同时被static和final修饰的常量,在声明时必须赋值;被final修饰的可以再声明时赋值也可以在类初始化时赋值,就是必须在调用之前赋值)
  4. 解析  把类中的符号引用转换为直接应用
  5. 初始化  为类的静态变量赋予正确的值,jvm负责对类进行初始化,主要对类变量进行初始化。类的初始化时机:
    1. new
    2. 访问某个类或接口的静态变量,或对该静态变量赋值
    3. 反射Class.forname
    4. 调用类的静态方法
    5. 初始化某个子类,父类也会被初始化
    6. java虚拟机启动时被标明为启动类的类,直接使用java.exe来运行某个主类

类的生命周期说完了,接下来说说类的的加载器,有三种

  1. BootstropClassLoader:负责加载jdk安装目录下jre/lib下,或者-Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库,所有的java.*开头的类都会被加载
  2. ExtensionClassLoader:负责加载jdk安装目录下jre/lib/ext目录中,或者javax.*开头的类,开发者可以直接扩展类加载器
  3. ApplicationClassLoader:就好比引用的第三方包,加载的是classpath下的包

 

转载于:https://my.oschina.net/Pirvate/blog/2989689

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值