Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17472
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 211
  • 用 户 组: 普通用户
  • 注册时间: 2015-12-09 16:47
文章分类

全部博文(21)

文章存档

2017年(1)

2016年(9)

2015年(11)

我的朋友
最近访客

分类: Java

2016-07-25 15:13:55

虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换,解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机加载机制。

java语言里,类型的加载和连接都是在程序运行的时候完成的。这样会增加一些性能开销。但能为java应用程序提供高度的灵活性。Java中可以动态扩展的语言特性就是依赖运行期动态加载和动态链接实现的列如,如果编写一个接口的应用程序,可以在运行时再给他指定实现方式。

类从被加载到虚拟机内存到卸载的生命周期有以下阶段

加载,验证,准备,解析,初始化,使用和卸载七个阶段。这些过程并不是固定的,可以交叉进行(为了支持java语言动态绑定)

什么时候加载类,java虚拟机并没有强制进行约束,但是对于初始化阶段虚拟机规定有且只有四种 情况才对类进行初始化(前几个阶段应该在初始化之前做好)。

1:遇到new,getstatic,inputstaticinvokestatic这四条字节码指令时,如果类没有初始化,则应该先使其初始化。这四条指令最常见的代码场景是:使用new关键字实例化对象的时候,读取或设置一个类的静态字段的时候(被final修饰,已在编译时放在常量池的字段除外)以及调用一个类的静态方法的时候。

2:使用java.lang.refect包的方法对其方法进行发射调用的时候。

3:当初始化一个类的时候,如果发现启发类还没进行初始化,则应该初始化其父类。

4:当虚拟机启动时,用户需要指定一个类作为程序的入口。

阅读(295) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~