`
生活的聆听者
  • 浏览: 16698 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java类加载原理浅析

    博客分类:
  • JVM
 
阅读更多

<div class="iteye-blog-content-contain" style="font-size: 14px"></div>

我们都知道Java程序最终都是以class文件的表现形式,其中这些class文件都要被加载到JVM之后才能改被执行和使用。但是对于JVM是如何去加载这些Class文件?以及Class文件被加载到JVM中之后会发生什么变化?下面来做个简单的对于JVM类加载的浅析。

JVM把class文件加载到内存中,并要经过一些特定的操作过程才能被JVM所认可,首先要对数据进行校验、转换解析,初始化等过程,最终才能被JVM直接所使用。这就是JVM的类加载机制。下面是类加载的几个过程图,根据图能更加直观的了解加载过程。




下面来具体说说以上各个阶段所做的具体事情。

1. 加载阶段
1) 通过类的权限定名称获取此类的二进制字节流
2) 将这个字节流转所代表的静态存储结构转换成JVM中方法区运行时数据
3) 在Java堆中生成一个代表此类的Class对象,主要是作为方法区数据的访问入口
实际上仅仅根据上面三点的描述还是比较抽象模糊,让人不太理解,如果想要准确理解需要详细了解JVM几个运行时数据区以及他们之间的联系。



下面简单介绍一下JVM几个内存区域所存放的具体数据信息
1:方法区:方法区和JAVA堆区一样是线程间共享的内存区域,它主要用于存放被JVM加载的类信息、常量、静态变量、以及编译之后的代码等数据。
2:堆区:对于JVM来说堆区是JAVA虚拟机所管理的内存区域中最大的一块内存区。它也是被所有线程共享的一块区域,在启动JVM的过程中创建而成。对于堆区来说存放的主要是JAVA对象实例,可以这么说几乎所有的java对象实例都在堆区进行分配。
3:本地方法栈和虚拟机栈:JAVA虚拟机栈是线程私有的内存区域,它的生命周期和线程的生命周期相同。我们都知道JAVA中普遍存在着方法,其实java虚拟机栈是java方法执行的内存模型,这句话可以这么理解:java中每个方法执行的时候都会创建一个属于这个方法的栈帧,
2. 验证阶段
JVM的验证阶段的工作量在JVM的类加载系统中占了比较大的一部分,但是根据官方文档规范说明来看对于这一块的介绍的比较笼统,仅仅说了如果校验到class文件存储格式不合法就抛出异常。并且各个不同的JDK对于类验证的具体实现可能有所不同,但是大部分都是可以分为如下几个验证阶段:文件格式验证、元素据验证、字节码验证、和符号引用验证。

3. 准备阶段

4. 解析阶段


5. 初始化阶段

6. 使用阶段


7. 卸载阶段

 

分享到:
评论
1 楼 生活的聆听者 2014-11-06  
还没写完,先上传这一部分吧,文章中有两张图片可以在附件文档里面直接下载。

相关推荐

Global site tag (gtag.js) - Google Analytics