python类加载机制_JVM系列-类加载机制(示例代码)

简介

在java中,类的声明周期总共分为以下几种: 加载(Loading),验证(Verification),准备(Preparation),解析(Analysis),

初始化(Initialization),使用(Using),卸载(Unloading)。其中,验证,准备,解析统称为连接(Linking)如图

lazy.gif

一、加载:

在加载阶段,JVM需要完成以下准备:

通过一个类的全限定名来获取定义此类的二进制字节流(并非要从class文件获取,也可从jar或war中读取,也可以在运行时动态生成,还可以编译jsp时获取)

二、验证:

验证是为了确保class文件中的字节流包含的信息符合JVM的要求,并且不会危害JVM自身的安全,验证大致分为四中方法:

文件格式验证: 验证字节流是否符合class文件的规范,例:主次版本号是否在当前JVM范围内,常量池中的常量是否有不被支持的类型

元数据验证: 对字节码描述的信息进行语义分析(javac编译阶段的语义分析),以保证其描述信息符合java语言规范要求

字节码验证: 通过数据流和控制流分析,确保程序是合法的,符合逻辑的

符号引用验证: 确保解析动作能正确执行

PS: 验证阶段是很重要的,但不是必须的,如果所引用的类已经经过了反复校验,可以使用 -Xverifynone参数来关闭一些验证措施,

用来缩短JVM加载时间

三、准备:

准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些变量所使用的内存都将在方法区中进行分配。

这里进行的内存分配仅包含类变量(被static修饰的变量),不包含实例变量(区别见末尾)。

初始值例: public static int value = 123;

如上声明的话value的值会在准备阶段后为0而不是123。因为此时尚未执行任何java方法,value被赋值123是程序被编译后存放于

类构造器中。但是还有一种特殊情况:

初始值例:public static final int value = 123;

这时在准备阶段后会为value生成ConstantValue属性,赋值为123而非0。

类变量(静态变量):

在类中被static修饰,并且必须在构造方法和语句块之外

无论一个类创建了多少变量,类只拥有类变量的一份拷贝

类变量在程序开始是创建,程序结束时销毁

静态变量存储在静态存储区,经常被声明为常量

静态变量可以通过className,VariableName访问到

实例变量:

声明在类中,不在方法,构造方法,语句块之内

当一个对象被实例化之后,每个实例变量的值就跟着确定

实例变量在对象创建是创建,对象销毁时销毁

实例变量的值应至少被一个方法,构造方法或语句块引用,使得外部可以用这些方法获取实例变量的值

实例变量可以直接通过变量名访问,但在静态方法和其它类中,应使用完全限定名:ObjectReference.VariableName

未完待续

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值