Java的加载与执行原理详解 Java程序从编写到最终运行经历了哪些过程_二十四日的博客-程序员秘密

技术标签: java  

前言

Java程序从编写到最终运行大概可概括为3个阶段:编写、编译、运行阶段。

一、编写阶段

  1. 程序员在硬盘某个位置新建一个xxx.java文件
  2. 使用记事本或者其他文本编辑器例如EditPlus打开xxx.java文件
  3. 在xxx.java文件中编写符合Java语法规则的源代码
  4. 保存源代码

二、编译阶段

  1. 使用编译器(javac.exe【JDK安装后自带】)将 xxx.java文件编译为 xxx.class文件。如果 xxx.java文件中编写的源代码是符合语法规则的,编译会通过并生成xxx.class字节码文件;如果xxx.java文件中的源代码不符合语法规则,则编译不会通过,也不会生成xxx.class字节码文件。一个java源文件是可以生成多个class文件的。(编译实际上是检查语法)
  2. java命令格式:javac java源文件的路径(路径有绝对路径和相对路径之分)
  3. xxx.java源文件经过编译之后生成了A.class、B.class、C.class等文件,那么我们称A是一个类,B是一个类,C是一个类。其中A、B、C是类的名字。

三、运行阶段(JRE起作用)

  1. 使用JDK自带的一个命令/工具:java.exe(负责运行的命令/工具)执行字节码文件
  2. java命令格式:java 类名
  3. 执行java程序的步骤:
    <1>.先使用cd命令切换到Test.class文件所在的路径。
    <2>.执行java 类名
    java这个命令,后面跟的是“类名”,而绝对不能跟“文件路径”,因为java命令后面跟的不是文件,是一个“类名”。所以必须先切换到class文件所在路径,也是为了能让类加载器能够找到该class文件。
  4. 往下的步骤就全部交给JVM了,就不需要程序员进行干涉了。当执行java 类名回车以后,会经历以下步骤:
    <1>. 会先启动JVM(java虚拟机)
    <2>. JVM启动之后,JVM会去启动“类加载器classloader”
    类加载器的作用:加载类的。本质上类加载器负责去硬盘上找“类”对应的“字节码”文件。
    假设是“java HelloWorld”,那么类加载器会去硬盘上搜索:HelloWorld.class文件。
    假设是“java Test”,那么类加载器会去硬盘上搜索:Test.class文件。
    <3>. 类加载器如果在硬盘上找不到对应的字节码文件,会报错:找不到或无法加载主类
    类加载器如果在硬盘上找到了对应的字节码文件,类加载器会将该字节码
    文件装载到JVM当中,JVM启动“解释器”将字节码解释为“101010000…”这种
    二进制码,操作系统执行二进制码和硬件交互。
    默认情况下,类加载器去硬盘上找“字节码”文件的时候,默认情况下类加载器(classloader)会从当前路径下找。因此在运行时要先先使用cd命令切换到Test.class文件所在的路径。也可以设置一个环境变量classpath给类加载器指定一个路径,让类加载器去指定的路径下加载字节码文件。
    JVM会通过类加载器将字节码文件装载进去,然后JVM对字节码进行解释,将字节码解释为机器指令(二进制码)。JVM会将生成的二进制码交给OS操作系统,操作系统会执行二进制码和硬件进行交互。

总结

Java程序从编写到编译再到运行是一次完整的加载与执行过程。程序员写的源代码为xxx.java文件,源代码是无法直接被JVM识别。Java程序员编写的代码必须经过编译,将源代码编译为字节码,JVM能够识别字节码文件并将其解释并执行。

.java文件就是源文件,这个文件中编写源代码
.class文件为编译后的字节码文件。

javac命令负责编译
java命令负责运行

java程序的编译和运行过程可以在不同的操作系统上完成。因为java是跨平台的。

java源代码一旦编译之后,如果将源代码删除,只保留字节码文件也是可以执行的,因为参与运行的是字节码。但是最好不要把源程序删除,以防后期需要进行修改。

字节码文件不是二进制文件,它只是接近于二进制的字节码,需要由JVM解释为二进制然后被执行。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42168713/article/details/112102603

智能推荐

mysql的count()函数如何选择索引,千万级表的count()查询优化实例_count 索引_铁柱同学的博客-程序员秘密

一、前言&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;博主今天在对一个千万级表进行count(*)查询的时候,发现速度有点慢,达到了9s,这对于程序来说是不可承受的,因此萌生了优化count(*)查询的想法,这里记录一下。1、网上的主要两种说法(1)count(*) 函数会选择索引长度最短的字段 ps:索引长度指的是执行计划explain里面的key_len长度。...

matlab 从 excel读取 日期_如何在Matlab中读取Excel数据_weixin_39639096的博客-程序员秘密

01功能介绍excel是我们常用的一款电子表格软件,其可以直观的展现我们收集的数据,并对其进行数据处理。excel中自带了许多数学函数,可以满足我们的基本日常计算,但当我们需要进行一些复杂计算,比如迭代计算,矩阵计算时,对于不懂vba语言的使用者来说就很难实现了。而对于像作者一样,不懂vba但会matlab或python语言的使用者可以使用另一种方,即将excel的数据读入另外的编程软件...

C++——优先级队列(priority_queue)__好好学习的博客-程序员秘密

1.优先级队列(priority_queue)1.1 基本概念之前已经提到了队列(queue),队列是一种先进先出(First in First out,FIFO)的数据类型。每次元素的入队都只能添加到队列尾部,出队时从队列头部开始出。优先级队列(priority_queue)其实,不满足先进先出的条件,更像是数据类型中的“堆”。优先级队列每次出队的元素是队列中优先级最高的那个元素,而不是队首的元素。这个优先级可以通过元素的大小等进行定义。比如定义元素越大优先级越高,那么每次出队,都是将当前队.

基于PgRouting的GIS网络分析--数据准备_weixin_33859504的博客-程序员秘密

一 前言PgRouting是基于开源空间数据库PostGIS用于网络分析的扩展模块,最初它被称作pgDijkstra,因为它只是利用Dijkstra算法实现最短路径搜索,之后慢慢添加了其他的路径分析算法,如A算法,双向A算法,Dijkstra算法,双向Dijkstra算法,tsp货郎担算法等,然后被更名为p...

ReactOS学习笔记(1)-《Windows内核设计思想》随书源代码编译问题_五号的csdn的博客-程序员秘密

相信很多同学在使用随书源代码中的VMWare虚拟机进行调试的时候会发现:启动虚拟机后通过快捷方式运行Windbg,Windbg执行到第一个断点(osloader!DbgBreakPoint+0x9)时,源代码文件窗口并没有像书中描述的一样弹出,解决这个问题的方式如下:随书源代码的压缩文件名为25314.rar,解压后文件夹名为25314,需将其重命名为code并置于E盘根目录下。如果没有E

随便推点

配置管理小报101011:怎样刷新本地DNS缓存。_weixin_33924770的博客-程序员秘密

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

Flex应用程序启动详解_jexchen博客_65b95065的博客-程序员秘密

      编写一个简单的Flex应用程序并不复杂,就算你从来没接触过Flex程序设计,照着帮助的实例步骤,不需花多长时间也能做出一个漂亮简捷的小程序出来。不过,随着对Flex程序编写的深入,会越来越觉得,其实要编写一个好的Flex应用程序并不简单,涉及到各个方面的知识,需要对Flex应用程序的架构、事件机制的处理、设计与程序的结合等等各个方面均要有所掌握。      接下来我会写一个

线性同余法生成随机数Matlab_生成安全的随机数_weixin_39625172的博客-程序员秘密

0x01:生产随机数的方式Math.random()0到1之间随机数java.util.Random伪随机数(线性同余法生成)java.security.SecureRandom真随机数java.util.concurrent.ThreadLocalRandom每一个线程有一个独立的随机数生成器0x02:Math.random()Math.random()产生的随机数是在0 到1之间的一个doub...

ArcGIS 卷帘效果_dkjh93562的博客-程序员秘密

一直没注意ArcGIS自带了卷帘功能,使用方法:调出Effects工具条,里面就有卷帘工具。AE开发参考:http://bbs.esrichina-bj.cn/esri/viewthread.php?tid=70139&amp;page=1http://blog.csdn.net/giselite/article/details/17298191转载于:https://w...

优化MySchool 第四章课后5 视图_优化myschool数据库第四章上机五_子晴呀的博客-程序员秘密

USE LibraryGO--创建索引IF EXISTS (SELECT * FROM sysindexes WHERE name = 'IX_BOOK_BookName') DROP INDEX Book.IX_BOOK_BookName --删除索引/*--笔试列创建非聚集索引:填充因子为30%--*/CREATE INDEX IX_BOOK_Book

lightGBM简述_lightgbm中文名_千寻~的博客-程序员秘密

lightGBM简介     xgboost的出现,让数据民工们告别了传统的机器学习算法:RF、GBM、SVM ……..  现在微软推出了一个新的boosting框架,想要挑战xgboost的江湖地位。顾名思义,lightGBM包含两个关键点:light即轻量级,GBM 梯度提升机。LightGBM 是一个梯度 boosting 框架,使用基于学习算法的决策树。lightGBM特点概括来说,lig...

推荐文章

热门文章

相关标签