java执行过程

梦中山河 梦中山河     2022-08-02     174

关键词:

Java的运行原理

在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(ByteCode),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。

Java虚拟机(JVM)

Java虚拟机(JVM)是Java VirtualMachine的缩写,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能模拟来实现的。

java中,类加载器把一个类装入JAVA虚拟机需要经过三个步骤来完成:装载、链接、初始化,其中链接又分来校验、准备、解析过程

装载:查找和导入.class文件

连接:检查装入.class文件的正确性,然后,java虚拟机为变量分配内存,设置默认值

初始化:把符号引用变成直接引用。

 

  1. public class Main { 
  2. private static int size=1; 
  3. public static void main(String args[]) {  
  4. User u = new User(); 
  5. u.setName("李文水"); 
  6. u.setPwd("159");  
  7. String name = u.getName(); 
  8. String pwd = u.getPwd(); 
  9. u = null; 
  10. }  
  11. }  
  12. public class User { 
  13. private String name; 
  14. private String pwd; 
  15. public String getName() { 
  16. return name; 
  17. }  
  18. public void setName(String name) { 
  19. this.name = name; 
  20. }  
  21. public String getPwd() { 
  22. return pwd; 
  23. }  
  24. public void setPwd(String pwd) { 
  25. this.pwd = pwd; 
  26. }  

现在假设这两个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虚拟机垃圾回收机制。(没有什么实际意义)

 

 

当执行 u =null;时这条线就被斩断了,因此User实例就不可以触及了,所以java虚拟机就可以回收这个User实例了

java代码编译和执行的整个过程

...由Java源码编译器来完成,流程图如下所示:Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制:Java源码编译机制类加载机制类执行机制Java源码编译机制Java... 查看详情

java代码编译和执行的整个过程

...由Java源码编译器来完成,流程图如下所示:Java字节码的执行是由JVM执行引擎来完成,流程图如下所示:Java代码编译和执行的整个过程包含了以下三个重要的机制:Java源码编译机制类加载机制类执行机制Java源码编译机制Java源码... 查看详情

java代码编译和执行的整个过程

Java代码的编译和执行的整个过程大概是:开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转... 查看详情

java代码编译和执行的整个过程(代码片段)

Java字节码的执行是由JVM执行引擎来完成,流程图如下所示:Java代码编译和执行的整个过程包含了以下三个重要的机制:Java源码编译机制类加载机制类执行机制Java源码编译机制Java源码编译由以下三个过程组成:分析和输入到符... 查看详情

java程序执行过程

...文件依然保存在硬盘中保存,所以你要写:javaClassName//来执行这个 查看详情

java - 如何使用正则表达式作为过程中的参数通过java执行sql过程?

】java-如何使用正则表达式作为过程中的参数通过java执行sql过程?【英文标题】:Howtoperformsqlprocedurebyjavausingregexpasparameterinprocedure?【发布时间】:2015-04-2206:04:45【问题描述】:字段验证参数在我的sql数据库中默认具有^[A-Za-z\\-.\'... 查看详情

weblogic“java反序列化”过程远程命令执行

WebLogic“Java反序列化”过程远程命令执行详细信息:https://www.seebug.org/vuldb/ssvid-89726说明:反序列化是指特定语言中将传递的对象序列化数据重新恢复为实例对象的过程,而在这个过程中会执行一系列的字节流解析和对象实例化... 查看详情

从 Java 调用目录过程执行 SSIS 包

】从Java调用目录过程执行SSIS包【英文标题】:ExecuteSSISpackagefromJavacallingCatalogprocedures【发布时间】:2017-03-1316:23:35【问题描述】:所以我想做的是调用一个存储过程usp_Something,其中包含类似这样的内容EXEC[SSISDB].[catalog].[create_exe... 查看详情

java构造方法执行过程内存分析

packageDemo;publicclassBirthDate{privateintday;privateintmonth;privateintyear;publicBirthDate(intd,intm,inty){day=d;month=m;year=y;}}javabeanpackageDemo;publicclassDemo{publicstaticvoidmain(String[]ar 查看详情

java方法执行过程

弄清调用对象方法的执行过程十分重要,下面是调用过程的详细描述。1)编译器查看对象的声明类型和方法名,假设调用x.f(param),且隐式参数x声明为C类的对象。需要注意的是有可能存在多个名字为f但参数类型不一样的方法(ove... 查看详情

jsp执行过程

JSP执行过程图解第一次请求:当服务器上的一个JSP页面被第一次请求执行时,服务器上的JSP引擎首先将JSP页面文件转译成一个.java文件,也就是servlet,并编译这个java文件生成.class的字节码文件,然后执行字节码文件响应客户端... 查看详情

java执行过程

...,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(ByteCode),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的 查看详情

java使用jdbc技术操作sqlserver数据库执行存储过程

Java使用JDBC技术操作SqlServer数据库执行存储过程:1.新建SQLSERVER数据库:java_conn_test2.新建表:tb_User3.分别新建三个存储过程:1>带参数的新增用户存储过程:CREATEPROCEDURE[dbo].[p_Insert_User]@namenvarchar(50),@UserPwdnvarchar(50)ASBEGININSERTINTOt 查看详情

一个java程序的执行过程(转)

我们手工执行java程序是这样的: 1、在记事本中或者是UE的文本编辑器中,写好源程序; 2、使用javac命令把源程序编译成.class文件;   编译后的.class(类字节码)文件中会包含以下内容: ConstantPool:符号... 查看详情

java创建对象的初始化过程

...静态成员变量和静态代码块(java虚拟机加载类时,就会执行该块代码,故只执行一次)2.子类静态成员变量和静态代码块(java虚拟机加载类时,就会执行该块代码,故只执行一次)3. 父类普通成员变量4.父类普通代码块(每... 查看详情

面向对象编程——程序执行过程中内存分析

阅读目录内存分析(SxtStu.java)对于java和内存之间的注意事项内存分析(SxtStu.java)Java程序运行在JVM上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性,由此可见JVM的重要性。所以在学习Java内存分配... 查看详情

java的类加载过程

一个Java文件从编码完成到最终执行,一般主要包括两个过程:编译与运行。编译即将Java文件通过Javac命令生成.class文件的过程,运行就是将.class文件交给JVM进行执行。类加载过程即是指JVM虚拟机把.class文件中类信息加载进内存... 查看详情

为啥我在从 Java 批量执行 PostgreSQL 存储过程时收到错误消息,提示“未预期结果”?

】为啥我在从Java批量执行PostgreSQL存储过程时收到错误消息,提示“未预期结果”?【英文标题】:WhyI\'mgettinganerrorinformingthat"aresultwasnotexpected"whenexecutingstoredproceduresonPostgreSQLfromJavainabatch?为什么我在从Java批量执行PostgreSQL... 查看详情