程序执行过程:
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的可执行程序通常是指JAR(Java Archive)文件,它包含了一系列的类文件、资源文件以及相关的元数据。以下是三种常见的生成...
在Java开发领域,将项目转化为可执行程序和安装程序是发布软件的重要步骤。这个Java项目展示了如何使用Exe4j生成Windows平台下的EXE可执行程序,并通过Inno Setup创建安装包,使得用户能够方便地在Windows环境中运行...
Java项目开发过程中,将应用程序转化为可执行程序和安装程序是发布产品的重要步骤。在这个场景中,我们使用了JavaFX作为桌面应用的开发框架,以及JNA(Java Native Access)技术来实现与本地系统资源的交互。为了将...
在Linux环境下,Java程序可以通过Runtime类或者ProcessBuilder类来调用外部的可执行程序。这个过程通常涉及以下几个关键步骤: 1. **获取运行时环境**: 首先,你需要通过`Runtime.getRuntime()`方法创建一个...
Java打包成可执行程序是一个常见的需求,特别是在分发和部署Java应用程序时。本文将详细介绍如何将Java项目打包成jar文件,以及如何进一步利用JSmooth工具将其转换为Windows平台下的exe可执行程序。 首先,我们将...
在面向过程编程中,程序员关注的是如何将问题分解为一系列可执行的步骤,并且使用数据结构来存储和处理数据。例如,在C语言这样的面向过程语言中,我们定义函数来表示过程,使用数组和结构体等数据结构来表示数据。 ...
Java程序调用存储过程是数据库操作中的常见任务,特别是在处理大量数据或需要高效执行复杂业务逻辑时。存储过程是预编译的SQL语句集合,它们可以提高性能、减少网络流量,并提供更好的安全性。在Java应用程序中调用...
本文将详细讲解如何通过Java执行命令行程序,以及在处理过程中可能遇到的线程阻塞问题。 首先,我们来看标题提到的"通过JAVA执行命令行程序"。Java提供了Runtime类的exec()方法来执行外部命令。例如,如果你想要在...
标题提到的"java 桌面程序打包jar可执行包,类似达成exe可执行程序",指的是通过特定工具或方法,让Java程序像Windows平台上的.exe文件一样,双击即可运行。 Eclipse是一款广泛使用的Java集成开发环境(IDE),它...
在存储过程和Java程序的上下文中,SQL*Loader可能用于准备数据,然后由存储过程处理或通过Java程序进行进一步操作。 综上所述,"存储过程调用Java程序"涉及到的主要知识点包括: 1. 存储过程的概念和使用。 2. ...
编译器将高级语言代码转换成机器语言代码的过程称为编译,得到的是可执行程序(object code),需要链接器(linking)进行链接最终生成可执行文件(executable)。而解释器则是对源代码逐行解释并立即执行,不需要编译过程...
Java的try-catch-finally语句块可以用来捕获异常,finally块确保在任何情况下都能执行清理操作。 3. **文件和目录监控**:为了检测程序是否需要重启,可能需要监控日志文件或者程序的状态文件。Java的`java.nio....
Java程序通常运行在Java虚拟机(JVM)上,但为了让非Java环境的用户也能方便地运行Java应用程序,我们可以将其转换成Windows平台下的.exe可执行文件。这个过程涉及到的主要工具是exe4j,一个专门用于将Java应用打包...
Java 可执行程序和安装程序制作详解 本文主要介绍了 Java 可执行程序的制作方法和安装程序的制作方法。首先,介绍了三种生成 Java 可执行程序的方式:直接使用系统的 J2SE 二进制文件执行、编写脚本、使用第三方...
这个“经典java小程序源代码合集”是为Java初学者准备的宝贵资源,它包含了一系列在学习过程中可能会遇到的经典示例,有助于深入理解Java语言的核心概念。 首先,让我们探讨Java的基础知识。Java程序由类(class)...
这是指应用程序实际运行的目录,通常包含可执行的Java类文件、配置文件和其他必要的资源。在更新过程中,这个目录的内容将被新版本的内容覆盖。 3. **备份目录**: 在进行更新前,程序会将当前的运行目录内容复制...
这个脚本负责设置必要的环境变量,并调用Java执行Maven的核心组件。批处理脚本会处理如设置classpath、解析命令行参数等任务,使得用户可以方便地使用Maven的各种功能。 ### Maven文档 Apache-Maven.pdf可能包含了...
软件是由一个或多个可执行程序以及相关资源构成的,它能够接收输入、执行处理和输出结果。输入可以来自多种设备,而输出则可以通过不同的硬件设备展现。 程序设计语言是编写程序所使用的语言,它包括机器语言、汇编...
在数据库管理中,存储过程(Stored Procedure)是一种预编译的SQL代码集合,它封装了特定的功能,并在需要时由应用程序调用执行。存储过程在大型数据库系统中扮演着重要角色,因为它能提高性能、增强安全性、减少...