`
cynhafa
  • 浏览: 154736 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java虚拟机的运行原理

 
阅读更多

类加载器把一个类装入java虚拟机需要分三个步骤完成:分别为“装载”、“连接”、“初始化”,其中连接分为:验证、准备、解析过程;java源程序经过编译后形成字节码,字节码由java虚拟机解释执行,然后由java虚拟机的解释器解释成特定系统的机器码执行。

转载:查找和导入.class文件

连接:验证(确保Java类型数据格式正确并且是与java虚拟机使用),准备(为该类型分配它所需内存)、解析(负责把常量池中的符号引用转为直接引用)

初始化:给类变量赋予适当的初始值

1、装载:

描述:java虚拟机装载指定的CLASS文件

结果:形成这个CLASS类得实例对象

过程:JVM使用类装载器定位到相应的CLASS文件,然后读取这个CLASS文件(一个线性二进制数据流),将它传入java虚拟机中;紧接着虚拟机提取其中的类型信息,如:该类的类名、方法名、变量名、修饰符、方法的返回类型等。还有一个重要的常量池(常量池保存了该类型的所有常量,包括直接常量和对其他类型,字段,方法的符号引用)将这些信息保存在一个叫方法区的地方。最终形成CLASS类的实例,这个实例存放在内存的堆区。它成为了java程序与内部数据结构之间的接口,程序要访问该类型的信息,程序就调用该类型对应的CLASS实例对象的方法。简而言之:这个过程就是把一个类型的二进制数据解析为方法区中的内部数据结构,并在堆上建立一个CLASS对象的过程。

2、连接

描述:验证、准备、解析

结果:此类型是正确的

过程:

验证:确定类型符合java语言的语义,比如:final类不能有子类,final方法不能被覆盖,确保在类型和超类型之间没有不兼容的方法声明(比如两个方法拥有同样的名字,参数完全相同,但返回类型不同)。
准备:java虚拟机为类变量分配内存,设置默认值

解析:在类型的常量池中寻找类,接口,字段和方法的符合应用把这些符号引用替换成直接应用的过程

示例:

在类中定义了一个全局变量:final public static size=1;User u = new User();Java虚拟机为size分配内存,并赋默认值0.找到常量池中User类的引用,如果User类还没有被装载,则装载并且连接该类,然后将常量池中对User类的引用替换为直接引用。在此时User类并不会被初始化,因为还没有用它。

3、初始化

描述:初始化静态区,包括静态变量、静态代码块

结果:这个类型可以使用了

过程:可能会调用()方法,(这个方法只能够由java虚拟机调用)来初始化该类的静态变量。在调用这个方法前,必须确认该类的超类的() 方法已经被调用。java虚拟机将size的赋值为1.

4、使用该类代码:

4.1 User u = new User();(存放在内存的堆区)

创建了一个User类实例,实际上是通过这个类的CLASS实例实例化的。方法如下:

User u = (User)Class.forName("User").newInstance();为了方便,用C代替Class.forName("User")。
4.2u.setName("李文水"); u.setPwd("159");

调用该类的方法,为该类的变量赋值,Java虚拟机内部调用是这样的,通过方法区找到该方法,利用CLASS实例的如下方法调用:
c.getMethod("setName").invoke(u,"李文水");

4.3 String name = u.getName(); String pwd = u.getPwd();
与第二步类似,不同的是将取得的值分别赋给了变量name和pwd。关键是这个值保存在哪里?和实例对象一样,存放在堆区。这个时候我应该可以看出CLASS实例的作用了,它就是起个中间作用,将程序中的调用反应到堆区上数据的变化。

文章来源:http://zhidao.baidu.com/question/186854489.html

分享到:
评论

相关推荐

    Java运行原理与Java虚拟机.pdf

    Java运行原理与Java虚拟机.pdf,欢迎下载

    java虚拟机的原理和作用

    java虚拟机的原理和作用,更深层地了解java程序的运行

    Java虚拟机class文件原理

    关于java虚拟机的calss文件如何加载的东西,很实用

    java虚拟机的原理!

    Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台...

    Java虚拟机规范.Java SE 8版.zip

    围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析,深刻揭示Java虚拟机的工作原理。同时,书中不仅完整地讲述了由Java SE 8所引入的新特性,...

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

     作者以易于理解的方式深入揭示了java虚拟机的内部工作原理,深入理解这些内容,将对读者更快速地编写更高效的程序大有裨益!  本书共分20章,第1-4章解释了java虚拟机的体系结构,包括java栈、堆、方法区、执行...

    java虚拟机规范 jdk8.

    围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析,深刻揭示Java虚拟机的工作原理。同时,书中不仅完整地讲述了由Java SE 8所引入的新特性,...

    Java虚拟机规范中文版

    想深入了解JAVA语言,或对Java虚拟机的运行原理感兴趣的可以看一看。 这是PDF版本

    Java虚拟机规范 Java SE 8版

    阐释了Java虚拟机各方面的细节,围绕Java虚拟机整体架构、编译器、class文件格式、加载、链接与初始化、指令集等核心主题对Java虚拟机进行全面而深入的分析,深刻揭示Java虚拟机的工作原理。同时,书中不仅完整地...

    Java虚拟机规范pdf

    java虚拟机实现的规范,对于底层运行原理的理解可以更深一层,是java程序员进阶的一大工具书,也可以增进对代码的理解。

    JVM运行原理以及性能监控

    Java虚拟机运行原理,以及运行状态监控

    深入JAVA虚拟机

    学习java技术必备的文档,深入浅出地介绍了java虚拟机的原理和功能

    JAVA虚拟机精讲

    《Java虚拟机精讲》以极其精练的语句诠释了HotSpot VM 的方方面面,比如:字节码的编译原理、字节码的内部组成结构、通过源码的方式剖析HotSpot VM 的启动过程和初始化过程、Java 虚拟机的运行时内存、垃圾收集算法...

    Java虚拟机精讲.高翔龙.带书签完整版.pdf

    本书以极其精练的语句诠释了HotSpot VM 的方方面面,比如:字节码的编译原理、字节码的内部组成结构、通过源码的方式剖析HotSpot VM 的启动过程和初始化过程、Java 虚拟机的运行时内存、垃圾收集算法、垃圾收集器...

    JAVA虚拟机(JavaVirtualMachine)V5.0中文官方安装版

    Java虚拟机(JVM)是Java Virtual Machine的缩写,它是一个虚构出来... Java虚拟机的基本原理 Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可

    java类书籍-Java虚拟机规范中文版

    Java虚拟机规范中文版 详细介绍java虚拟机的运行原理等

    自己动手写Java虚拟机及class文件解析分析工具(java8运行)

    用go语言写的java虚拟机,主要是清楚的表达了jvm的原理。不懂go语言的其实也没关系,其中classpy这个可执行的jar文件,可以清楚的展现出class文件的结构

    YJVM—一种运行在嵌入式Linux内核中的Java虚拟机的设计与实现

    与传统的Java虚拟机不同,YJVM(Yet another JVM)是运行在嵌入式Linux内核中的Java虚拟机。实现了解释执行Java字节码、线程管理、执行环境管理、集成Classpath核心类库等基本功能。它可以使Linux在内核层次上支持...

Global site tag (gtag.js) - Google Analytics