`

java执行程序过程

    博客分类:
  • Java
 
阅读更多
程序执行过程:
1. Load到内存区
在硬盘上有一块程序代码,要想运行,编译好的东西load到内存。然后操作系统代码找到main方法,然后执行。
2.找到main方法开始执行。
3.执行过程中的内存管理一般分为四个部分:
  a code segment:存放代码,代码区
  b data segment:静态变量,字符串常量
  c stack(栈):局部变量
  d heap(堆):new出来的东西(动态分配)

java程序执行过程

1.java程序执行包括加载类和实例化类两个阶段。
首先加载类:对类中的静态成员初始化
然后main函数开始执行
实例化对象:非静态成员的定义初始化,接着完成调用构造函数
2.加载类阶段与实例化阶段都是按照先父类后子类的顺序进行。
3.加载类完成,理解形成Class类的一个对象,名字就是所加载类的类名,然后该Class类对象完成所加载类的静态成员的初始化。
4.JVM启动的时候就加载了Class类,并且分配空间,完成了相关的初始化。
5.一个类的静态成员并不存在于new出来的堆区空间中,而是存在该类对应的Class类对象的空间里。

Java程序执行过程:
首先将程序编译成字节码。
然后,Java虚拟机通过设定的CLASSPATH找到源程序相应的字节码程序,然后连接执行源程序。
在编译的时候静态的变量被初始化并被分配到指定的分区代码区,而其他的数据成员都是在程序执行的时候分配内存空间的。

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实例了
http://allenhk.iteye.com/blog/1866288

http://blog.csdn.net/cutesource/article/details/5904542

http://www.cnblogs.com/o-andy-o/archive/2012/04/11/2442109.html

分享到:
评论

相关推荐

    java打包成可执行程序

    java打包方法详述主要讲怎么导出包,利用JSmooth将jar包打包成可执行程序的过程

    自考04747《Java语言程序设计》课后习题答案全集.doc

    1.1 指出JAVA语言的主要特点和JAVA程序的执行过程。 5 1.2 说出开发与运行JAVA程序的重要步骤。 5 1.3 如何区分应用程序和小应用程序? 5 1.4 说出JAVA源文件的命名规则。 5 1.6 JAVA语言使用什么字符集?共有多少个...

    西南科技大学Java程序设计与实践 实验四 GUI实验实验报告及源码

    西南科技大学Java程序...执行过程; 2、简要分析Windows计算器的布局拆分思路; 3、完整介绍整数加、减、乘、除运算的实现思想和具体设 计实现过程。 4、简要说明你在该实验中的收获与体会。四 GUI实验实验报告及源码

    换器也兼容其他多版本的JAVA程序,比如S40手机的JAVA程序

    【数据库文件 MidpRuntimeDLL.dll】是重要的主程序文件,执行程序就是调用这个文件来模拟JAVA程序的。 【批处理文件 ★自动打包★.bat】是为了简化制作JAVA程序复杂过程的特殊文件,对DOS命令不熟悉的人有很大的...

    Java 应用程序中定时执行任务的定时器框架

    所有类型的 Java 应用程序一般都需要计划重复执行的任务。企业应用程序需要计划每日的日志或者晚间批处理过程。一个 J2SE或者 J2ME 日历应用程序需要根据用户的约定计划闹铃时间。不过,标准的调度类 Timer 和 ...

    Java服务器程序设计

    用java进行客户端的applet (小程序)开发的技术已广为使用,而用java进行服务器端的servlet(服务器小程序)开发则尚需揭开其神秘的面纱,本书正是基于这样的目的编写的。全书从java服务器的体系结构、开发工具和...

    java语言程序设计

    2. 理解汇编语言指令与机器语言指令的关系,理解高级语言与汇编语言的关系,理解编译程序或编译器的功能与作用,初步理解掌握执行程序的过程; 3. 了解高级语言发展简史;初步理解操作系统、客户/服务器以及Internet...

    java综合试题(面试题)

    6、Java源程序在转换为机器语言执行过程中既有编译也有解释。 ( ) 7、// 是java的多行注释符。 ( ) 面向对象 3.Java 仅支持类间的单重继承。 ( ) 17.方法可以没有返回值,或有一个返回值,也可以有多个返回值。...

    java程序中的内存分配问题

    本例通过一个简单的java程序来阐述了程序在执行过程中内存的动态分配,但分析过程非常详细,适合java初学者

    存储过程调用java程序

    NULL 博文链接:https://ytdolly.iteye.com/blog/782051

    《Java 语言程序设计》

    1、利用编辑器编写 Java源程序 源文件名:主类名.java 2、利用编译器将源程序编译成字节码 字节码文件名:源文件名.class 3、利用虚拟机(解释器)运行 工作过程:载入、代码校验、解释执行

    Java基础教案\JAVA精讲入门

     编译执行第一个Java程序 教学方法:  比较与比喻教学方式,提高学生的学习兴趣  程序调适,让学生对Java程序获取感性认识,激发兴趣;  适度提问,养成学生勤于思考的学习习惯 教学过程设计: 1.讨论,...

    【Java语言程序设计教程】Java课程设计-教学大纲.docx

    通过程序设计的训练,使学生能够综合应用JAVA基础知识和基础方法,编写出高效率的应用程序,体会软件设计全过程,提高软件设计能力,为今后进行系统软件和应用软件的开发研究打下坚实的基础,培养刻苦专研和严谨的...

    JAVA编写的进度程序

    用纯JAVA程序实现一个进度条,有背景图片,很实用的一个程序,是JAVA轻组建编程的一个典型例子

    在 Java 应用程序中定时执行任务.doc

    所有类型的 Java 应用程序一般都需要计划重复执行的任务。企业应用程序需要计划每日的日志或者晚间批处理过程。一个 J2SE 或者 J2ME 日历应用程序需要根据用户的约定计划闹铃时间。不过,标准的调度类 Timer 和 ...

    计算机程序设计(Java)-教案--单元二--Java语言开发基础.docx.docx

    ・:・能熟练、准确地应用分支、循环、跳转三种流程执行过程; 教学重点 :・标识符命名规那么、数据类型与运算符; : 嵌套ifelse语句的用法; 教学难点 :・数值类型转换(强制转换、隐式转换)的用法; :・Switch...

    Java Pathfinder(JPF)完全安装配置过程(2013年6月)

    Java PathFinder是一个可执行Java程序调试/检验系统。它的内核是一个Java虚拟机(JVM),可用于系统地探测程序所有可能的执行路径,以避免死锁或无法处理的异常之类的情况发生。与传统的调试程序不同,Java PathFinder...

    Java实战项目:计算器应用程序 - 实现基本的数学运算功能

    在整个过程中,我将提供清晰的思路和Java代码示例,以确保您能够理解和实现这个应用程序。 第一部分:创建用户界面 首先,让我们创建一个用户界面,让用户能够输入数字和选择要执行的操作(加法、减法、乘法、除法...

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

Global site tag (gtag.js) - Google Analytics