Java程序从源文件创建到程序运行

一、Java程序从源文件创建到程序运行要经过两大步骤:

1、编译期:编译器把 .java 源代码文件编译成 .class 字节码文件

2、运行期:Java类加载器将 .class 字节码文件加载到内存,在 JVM 中进行解释并生成可执行代码。

因为 Java 程序既要编译同时也要经过 JVM 的解释运行,所以说Java被称为半解释语言( “semi-interpreted” language)。
在这里插入图片描述
编译期
创建完源文件之后,程序先要被 JVM中 的 Java 编译器进行编译为 .class 文件。Java 编译一个类时,如果这个类所依赖的类还没有被编译,编译器会自动的先编译这个所依赖的类,然后引用。如果 Java 编译器在指定的目录下找不到该类所依赖的类的 .class 文件或者 .java 源文件,就会报 “Cant found sysbol” 的异常错误。

编译后的字节码文件格式主要分为两部分:常量池和方法字节码。常量池记录的是代码出现过的(常量、类名、成员变量等)以及符号引用(类引用、方法引用,成员变量引用等);方法字节码中放的是各个方法的字节码。

运行期
Java 类运行的过程大概分为:类的加载和类的执行。需要说明的一点的是:JVM 并不是在运行时就会把所有使用到的类都加载到内存中,JVM主要在程序第一次运行时主动使用类的时候,才会立即去加载。

在 Java 中,JVM可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java程序无须重新编译便可在多种不同操作系统的计算机上运行。

二、对象的创建和使用:内存解析
在这里插入图片描述
1、堆(Heap),此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配。
2、通常所说的栈(Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。
局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char 、 short 、 int 、 float 、 long 、double)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。 方法执行完,自动释放。
3、方法区(Method Area),用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。
4、一个进程有多个线程,每个线程有自己的栈和计数器但共用方法区和堆。

三、 Java语言运行机制及运行过程
核心机制—Java虚拟机
1、JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指
令,管理数据、内存、寄存器。
2、对于不同的平台,有不同的虚拟机。
3、只有某平台提供了对应的java虚拟机,java程序才可在此平台运行
4、Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行”
在这里插入图片描述
在这里插入图片描述
核心机制—垃圾回收
1、不再使用的内存空间应回收—— 垃圾回收。
2、在C/C++等语言中,由程序员负责回收无用内存。
3、Java 语言消除了程序员回收无用内存空间的责任:它提供一种系统级线程跟踪存储空间的分配情况。并在JVM空闲时,检查并释放那些可被释放的存储空间。
4、垃圾回收在Java程序运行过程中自动进行,程序员无法精确控制和干预。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值