Java的运行原理

在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(ByteCode)(class文件的内容),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。跨平台:话说,在北京,一般都是讲北京话的,上海,一般都是将上海话,广东,广东话...现有一公文发出,要全国执行,该当如何?——先统一翻译成普通话。各地在将普通话版本翻译成当地的方言。这里,北京、上海就是不同类型的机器windows,linux...编译(javac)就是将公文翻译成普通话的过程,而编译出的.class文件,就是公文的普通话版本。在执行的时候,各地的翻译就是jvm,负责将.class转换成本地能够理解的方言来执行。*.java→*.class→机器码java编译器 (编译) → 虚拟机(解释执行) →  解释器(翻译) → 机器码Java虚拟机(JVM)Java虚拟机(JVM)是Java Virtual Machine的缩写,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能模拟来实现的。Java中,类加载器把一个类装入JAVA虚拟机需要经过三个步骤来完成:装载、链接、初始化,其中链接又分来校验、准备、解析过程装载:查找和导入.class文件链接:检查装入.class文件的正确性,然后,java虚拟机为变量分配内存,设置默认值初始化:把符号引用变成直接引用。。。

View Code现在假设这两个java源文件已经被编译成了CLASS文件了,我们来看看java虚拟机怎么执行的。Java虚拟机工作流程:1.装载描叙:Java虚拟机装载指定的CLASS文件结果:形成这个CLASS类的实例对象过程:java虚拟机使用类装载器定位到相应的CLASS文件,然后读取这个CLASS文件(一个线性二进制数据流),将它传入java虚拟机中。紧接着虚拟机提取其中的类型信息。比如:该类的类名,方法名,变量名,修饰符,方法的返回类型等等。还有一个重要的东西就是常量池。(常量池保存了该类型的所有常量,包括直接常量和对其他类型,字段,方法的符号引用)将这些信息保存在一个叫做方法区的地方。最终形成CLASS类的实例,这个实例存放在内存的堆区。它成为了java程序与内部数据结构之间的接口,程序要访问该类型的信息,程序就调用该类型对应的CLASS实例对象的方法。简而言之:这个过程就是把一个类型的二进制数据解析为方法区中的内部数据结构,并在堆上建立一个CLASS对象的过程。示例:装载Main类Java虚拟机读取Main类的CLASS文件,生产对应的java.lang.Class类的实例,读取其中的类型信息,比如修饰符 private,public,static,另外变量 size,name,pwd,User(User即为一个引用)共同构成了这个类的常量池。将这些信息保存在方法区,2.链接描述:验证,准备,解析(可选)结果:这个类型是正确的。(这里不知道该怎么描述)过程:1)验证:确定类型符合java语言的语义,比如:final类不能有子类,final方法不能被覆盖,确保在类型和超类型之间没有不兼容的方法声明(比如两个方法拥有同样的名字,参数完全相同,但返回类型不同)。2)准备:java虚拟机为类变量分配内存,设置默认值3)解析:在类型的常量池中寻找类,接口,字段和方法的符合引用把这些符号引用替换成直接引用的过程。示例: 连接Main类Java虚拟机为size分配内存,并赋默认值0.找到常量池中User类的引用,如果User类还没有被装载,则装载并且连接该类,然后将常量池中对User类的引用替换为直接引用。在此时User类并不会被初始化,因为还没有用它。3.初始化描述:初始化一些静态变量结果:这个类型可以使用了过程:可能会调用()方法,(这个方法只能够由java虚拟机调用)来初始化该类的静态变量。在调用这个方法前,必须确认该类的超类的() 方法已经被调用。示例:初始化Main类Java虚拟机将Main类的静态变量赋值为1.4.使用(执行该类代码了)1.User u = new User();(存放在内存的堆区)创建了一个User类实例,实际上是通过这个类的CLASS实例实例化的。方法如下:User u=(User)Class.forName("User").newInstance();为了方便,用C代替Class.forName("User")2.u.setName("李文水"); u.setPwd("159");调用该类的方法,为该类的变量赋值,Java虚拟机内部调用是这样的,通过方法区找到该方法,利用CLASS实例的如下方法调用:c.getMethod("setName").invoke(u,"李文水");3.String name = u.getName(); String pwd = u.getPwd();与第二步类似,不同的是将取得的值分别赋给了变量name和pwd。关键是这个值保存在哪里?和实例对象一样,存放在堆区。这个时候我应该可以看出CLASS实例的作用了,它就是起个中间作用,将程序中的调用反应到堆区上数据的变化。4.u = null;这个步骤写出来的目的是了解一下Java虚拟机垃圾回收机制。(没有什么实际意义)Java虚拟机内部会根据一种规则(这个对象是否可以触及)来判断这两个类是否可以回收了?具体形式如下:当执行 u = null;时这条线就被斩断了,因此User实例就不可以触及了,所以java虚拟机就可以回收这个User实例了一步一个脚印,方便自己复习,欢迎大家指正,非常感谢,共同进步!

(0)

相关推荐

  • 类加载机制

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

  • JVM 解析阶段 符号引用和直接引用的区别

    在JVM中,类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载7个阶段.而解析阶段即是虚拟机将常量池内的符号引用替换为直接引用的过程. 1 ...

  • 一文汇总JVM所有知识点(一)

    一文汇总JVM所有知识点(一)

  • JVM-类加载

    JVM 类加载 JVM整个流程图 一个java文件被编译为class文件后,剩下的操作都交给jvm来执行,其中第一步就是将class文件加载到jvm,而这一步就是由类加载器来完成的 类加载的流程又分为 ...

  • PFC无损吸收电路运行原理及电路图

    描述 PFC无损吸收电路运行原理 如图所示,这是一个比较基础的无损吸收PFC主电路的原理图.我们可以看到在该电路系统中,图中B1为整流桥,L1为PFC升压电感,D1为隔直二_极管,S1为开关管,C1, ...

  • 板式换热器组装流程及其运行原理

    板式换热器组装流程及其运行原理

  • 半桥电路的运行原理及注意问题

    在PWM和电子镇流器当中,半桥电路发挥着重要的作用.半桥电路由两个功率开关器件组成,它们以图腾柱的形式连接在一起,并进行输出,提供方波信号.本篇文章将为大家介绍半桥电路的工作原理,以及半桥电路当中应该 ...

  • 连续升降机,看看它的运行原理

    连续升降机,看看它的运行原理

  • 火电、核电、水电、光电、垃圾发电都是什么流程,运行原理动图

    ▲ 火力发电流程原理 ▲ 核能发电流程原理 ▲ 水力发电流程原理 ▲ 光热发电原理 ▲ 光伏发电原理 ▲ 垃圾发电原理 ▲ 风力发电原理 ▲ 蒸汽吸收式制冷原理 ▲ 尿素热解脱硝流程原理 ▲ 湿法脱硫 ...

  • 通过一个简单的例子,了解 Cypress 的运行原理

    Cypress 是 SAP Spartacus 前端 e2e 测试使用的框架. Cypress 并不是广义上的 web 自动化工具,并不适合编写脚本来测试已经处于生产状态下的不受测试者控制的网站. C ...

  • 手机电脑运行原理原来是这样!电流像水一样流动!

    手机电脑运行原理原来是这样!电流像水一样流动!

  • 中医经络的基本运行原理(第一章)

    打坐仙翁 神奇的打坐,健康养生之术,抗衰老秘诀,传播健康理念,宏扬养生文化. 5篇原创内容 公众号 这12条经络分别连著人体12个脏器,所以这些经络都是用相连的脏器命名.其中,三焦是指人的整个胸腹,心 ...

  • 中医经络的基本运行原理(第二章)

    打坐仙翁 神奇的打坐,健康养生之术,抗衰老秘诀,传播健康理念,宏扬养生文化. 5篇原创内容 Official Account 六经的基本运行原理 六经是表里阴阳相配合的运行,太阴与阳明:少阴与太阳:厥 ...