java程序的运行过程
2016-02-28 17:50
579 查看
最近想系统的研究一下android的内存泄露相关问题,所以系统的学习了和重温了相关的知识,本部分会从操作系统、编译原理、组成原理的角度入手来分析这个问题。
Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行,而JVM是java的核心和基础,是java编译器和os平台之间的虚拟处理器。
VB,.NET,c#,java等都是程序设计语言,这个不用多说。
这块涉及的内容就是大学的编译原理的课程内容。
程序处理语言包含编译器,解释器。它的作用就是把程序设计语言翻译成目标语言。
以上两者的关系就是“语言”和“翻译者”的关系。在使用语言时,我们只能说,使用这种语言去书写一段程序。编译器则是能够将某种语言的源程序进行翻译,然后生成目标程序。
不同的设计语言有不同的编译器。我们通常会说,某个编译器支持了什么语言,正如一个翻译者只懂翻译英语,法语,但是不会日语,所以翻译不了日语一样,这个编译器只识别能识别得语言并翻译这种语言。
在程序的运行阶段则是在一个特定的平台上,由这个平台来执行编译生成的程序。编译器的作用就是沟通源程序和程序的运行平台。源程序相对于一个运行平台来说是不可识别的,但当编译器将源程序编译成为这个平台所能够识别的目标语言以后,程序就可以在这个平台上运行了。Java虚拟机是一个平台,DOS 和 Windows 也是平台。
JVM部分会在下一篇博客中详细讲解。
涉及线程和进程:进程是资源分配的基本单位,线程是调度的基本单位。
操作系统内存分配:
现在的操作系统用的内存分配方式多数是请求分页内存管理方式
这一块知识需要看一看《计算机组成原理》的存储器管理部分和《编码的奥秘》一书。
什么是内存呢?在计算机的组成结构中,有一个很重要的部分,就是存储器。存储器是用来存储程序和数据的部件,对于计算机来说,有了存储器,才有记忆功能,才能保证正常工作。存储器的种类很多,按其用途可分为主存储器和辅助存储器,主存储器又称内存储器(简称内存),辅助存储器又称外存储器(简称外存)。外存通常是磁性介质或光盘,像硬盘,软盘,磁带,CD等,能长期保存信息,并且不依赖于电来保存信息,但是由机械部件带动,速度与CPU相比就显得慢的多。内存指的就是主板上的存储部件,是CPU直接与之沟通,并用其存储数据的部件,存放当前正在使用的(即执行中)的数据和程序,它的物理实质就是一组或多组具备数据输入输出和数据存储功能的集成电路,内存只用于暂时存放程序和数据,一旦关闭电源或发生断电,其中的程序和数据就会丢失。
既然内存是用来存放当前正在使用的(即执行中)的数据和程序,那么它是怎么工作的呢?我们平常所提到的计算机的内存指的是动态内存(即DRAM),动态内存中所谓的“动态”,指的是当我们将数据写入DRAM后,经过一段时间,数据会丢失,因此需要一个额外设电路进行内存刷新操作。
http://blog.csdn.net/cutesource/article/details/5904542
一.一般应用程序的装入和链接
在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一件事情,便是将程序和数据装入内存。如何将一个用户源程序变为一个可在内存中执行的程序,通常都要经过以下几个步骤:首先是编译,有编译程序将用户源代码编译成若干个目标模块;由链接程序将编译后形成的一组目标模块,以及他们所需要的库函数链接在一起,形成一个完整的装入模块;最后是装入,由装入程序将装入模块装入内存。如下图:二.java的运行过程分析
Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行,而JVM是java的核心和基础,是java编译器和os平台之间的虚拟处理器。
1.应用程序层面:编写阶段——程序设计语言
java 编译器把文本java 源文件编译成bytecode的class文件,java 虚拟机再把bytecode class 文件翻译成操作系统能够读取的字节VB,.NET,c#,java等都是程序设计语言,这个不用多说。
2.应用程序层面:编译阶段——程序处理语言
java程序——字节码(ByteCode)(class文件的内容,它不面向任何特定的处理器,只面向虚拟机。)这块涉及的内容就是大学的编译原理的课程内容。
程序处理语言包含编译器,解释器。它的作用就是把程序设计语言翻译成目标语言。
以上两者的关系就是“语言”和“翻译者”的关系。在使用语言时,我们只能说,使用这种语言去书写一段程序。编译器则是能够将某种语言的源程序进行翻译,然后生成目标程序。
不同的设计语言有不同的编译器。我们通常会说,某个编译器支持了什么语言,正如一个翻译者只懂翻译英语,法语,但是不会日语,所以翻译不了日语一样,这个编译器只识别能识别得语言并翻译这种语言。
3.JVM层面:运行,调试阶段——JVM
Java字节码——到目标机器代码;执行是由JVM执行引擎来完成,JAVA的第二次编译。在程序的运行阶段则是在一个特定的平台上,由这个平台来执行编译生成的程序。编译器的作用就是沟通源程序和程序的运行平台。源程序相对于一个运行平台来说是不可识别的,但当编译器将源程序编译成为这个平台所能够识别的目标语言以后,程序就可以在这个平台上运行了。Java虚拟机是一个平台,DOS 和 Windows 也是平台。
JVM部分会在下一篇博客中详细讲解。
4.操作系统层面:运行,调试阶段——操作系统
链接上大学《操作系统》的相关知识涉及线程和进程:进程是资源分配的基本单位,线程是调度的基本单位。
操作系统内存分配:
现在的操作系统用的内存分配方式多数是请求分页内存管理方式
5.硬件层面(浅介绍)
涉及计算机组成原理相关的知识这一块知识需要看一看《计算机组成原理》的存储器管理部分和《编码的奥秘》一书。
什么是内存呢?在计算机的组成结构中,有一个很重要的部分,就是存储器。存储器是用来存储程序和数据的部件,对于计算机来说,有了存储器,才有记忆功能,才能保证正常工作。存储器的种类很多,按其用途可分为主存储器和辅助存储器,主存储器又称内存储器(简称内存),辅助存储器又称外存储器(简称外存)。外存通常是磁性介质或光盘,像硬盘,软盘,磁带,CD等,能长期保存信息,并且不依赖于电来保存信息,但是由机械部件带动,速度与CPU相比就显得慢的多。内存指的就是主板上的存储部件,是CPU直接与之沟通,并用其存储数据的部件,存放当前正在使用的(即执行中)的数据和程序,它的物理实质就是一组或多组具备数据输入输出和数据存储功能的集成电路,内存只用于暂时存放程序和数据,一旦关闭电源或发生断电,其中的程序和数据就会丢失。
既然内存是用来存放当前正在使用的(即执行中)的数据和程序,那么它是怎么工作的呢?我们平常所提到的计算机的内存指的是动态内存(即DRAM),动态内存中所谓的“动态”,指的是当我们将数据写入DRAM后,经过一段时间,数据会丢失,因此需要一个额外设电路进行内存刷新操作。
三.一些思考
计算机理论方方面面都是结构化的分层体系,我们学习知识以及在日常开发中要做的深入一些,对底层的一些理论要了解一些。这是一个程序员的基本素养。更多相关资料:
JVM学习笔记(二)——Java代码编译和执行的整个过程http://blog.csdn.net/cutesource/article/details/5904542
相关文章推荐
- Java泛型实例
- MyEclipse使用依赖项目在发布项目时报ClassNotFound
- 新手迷惑:复制文件路径报错java.io.FileNotFoundException
- java环境变量设置
- 新手迷惑:复制文件路径报错java.io.FileNotFoundException
- 保护眼睛-eclipse黑色背景设置
- springMVC-自定义数据类型转换器
- eclipse 配置优化
- [转]Spring注解原理的详细剖析与实现
- Java张孝祥视频 学习笔记 反射
- Ubuntu安装JDK
- 用正交多项式作最小二乘拟合的java实现(转)
- 白话Spring(基础篇)---依赖注入
- OA学习笔记-004-Spring2.5配置
- Java枚举单例
- SpringMVC处理Date类型的成员变量方法
- Java 学习笔记 ------第二章 从JDK到IDE
- 最小二乘法拟合java实现源程序(转)
- No_16_0226 Java基础学习第七天
- spring - ioc和aop