一、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程序运行过程中自动进行,程序员无法精确控制和干预。
————————————————
版权声明:本文为CSDN博主「MysteryCY」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42146136/article/details/109045985