2023年6月20日发(作者:)

java流程代码怎么写_Java程序员必备基础:Java代码是怎么运⾏的?前⾔作为⼀名Java程序员,我们需要知道Java代码是怎么运⾏的。最近复习了深⼊理解Java虚拟机,做了⼀下总结,希望对⼤家有帮助,如果有不正确的地⽅,欢迎提出,感激不尽。java 代码运⾏主要流程本⽂主要讲解流程如下:java源⽂件编译为class字节码类加载器把字节码加载到虚拟机的⽅法区。运⾏时创建对象⽅法调⽤,执⾏引擎解释为机器码CPU执⾏指令多线程切换上下⽂编译我们都知道,java代码是运⾏在Java虚拟机上的。但是java是⼀门⾯向对象的⾼级语⾔,它不仅语法⾮常复杂,抽象程度也⾮常⾼,并不能直接运⾏在计算机硬件机器上。Java虚拟机(Java Virtual Machine 简称JVM)是运⾏所有Java程序的抽象计算机,是Java语⾔的运⾏环境。因此,在运⾏Java程序之前,需要编译器把代码编译成java虚拟机所能识别的指令程序,这就是Java字节码,即class⽂件。所以,Java代码运⾏的第⼀步是:把Java源代码编译成.class 字节码⽂件。类加载在Class⽂件中描述的各种信息,需要被加载到虚拟机之后才能运⾏和使⽤。因此,需要把class字节码⽂件加载到Java虚拟机来。虚拟机把描述类的数据从 Class ⽂件加载到内存,并对数据进⾏校验、转换解析和初始化,最终形成可以被虚拟机直接使⽤的 Java 类型,这就是虚拟机的类加载机制。加载在加载阶段,虚拟机需要完成以下3件事情:通过⼀个类的全限定名来获取定义此类的⼆进制字节流。将这个字节流所代表的静态存储结构转化为⽅法区的运⾏时数据结构。在内存中⽣成⼀个代表这个类的对象,作为⽅法区这个类的各种数据的访问⼊⼝加载阶段完成后,这些⼆进制字节流按照虚拟机所需的格式存储在⽅法区之中。验证为了确保Class⽂件的字节流中包含的信息符合当前虚拟机的要求,不会危害虚拟机的安全,Java虚拟机对输⼊的字节流⾛验证过程。验证阶段包括四个阶段:⽂件格式验证、元数据验证、字节码验证、符号引⽤验证。⽂件格式验证: 验证字节流是否符合Class⽂件格式规范,如:是否以魔数0xCAFEBABE开头。元数据验证: 对字节码描述的信息进⾏语义分析,如:这个类的⽗类是否继承了不允许被继承的类(被final修饰的类);字节码验证: 主要⽬的是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。如:保证跳转指令不会跳转到⽅法体以外的字节码指令上。符号引⽤验证: 发⽣在虚拟机将符号引⽤转化为直接引⽤的时候,如:校验符号引⽤中通过字符串描述的全限定名是否能找到对应的类。准备准备阶段是正式为类变量分配内存并设置类变量初始值,这些变量所使⽤的内存都将在⽅法区中进⾏分配。如:publicstaticintvalue=123;变量value在准备阶段过后的初始值是0⽽不是123。解析解析阶段是虚拟机将常量池内的符号引⽤替换为直接引⽤的过程。⽐如:类引⽤类,在编译时,User类不知道Tool类的实际内存地址,因此只能使⽤符号(假设)来表⽰。⽽在类加载加载User类的时候,可以通过虚拟机获取Tool类的实际内存地址,因此便可以将符号替换为Tool类的实际内存地址,即直接引⽤地址。解析动作主要针对类或接⼝、字段、类⽅法、接⼝⽅法、⽅法类型、⽅法句柄和调⽤点限定符 7 类符号引⽤进⾏。初始化到了初始化阶段,才真正开始执⾏类中定义的Java字节码。在这个阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源。创建对象Java虚拟机是如何执⾏字节码的呢?我们先来看⼀下运⾏时创建对象。Java是⾯向对象的编程语⾔,程序的运⾏是以对象为调⽤单位的。字节码⽂件加载到虚拟机的⽅法区后,在程序运⾏过程,通过 class字节码⽂件创建与其对应的对象信息 。创建对象的⽅式有:new关键字,反射等。Java堆内存是线程共享的区域,创建后的对象信息就保存在Java堆内存中。⽅法调⽤JVM的调⽤单位是对象,但是真正执⾏功能性的代码还是对象上的⽅法。在运⾏过程中,每当调⽤进⼊⼀个java⽅法,java虚拟机会在当前线程的java⽅法栈中⽣成⼀个栈帧,⽤以存放局部变量以及字节码的操作数。⽅法栈内存是线程私有的,每个线程都有⾃⼰的⽅法栈。如果对应的⽅法是本地⽅法,则对应的就是本地⽅法栈。java运⾏时数据区域如下:解释当调⽤Java对象的某个⽅法时,JVM执⾏引擎会将该⽅法的字节码⽂件翻译成计算机所能识别的机器码,机器码信息保存在⽅法区中。翻译有解释执⾏和即时编译两种⽅式。两种翻译⽅式的区别如下:解释执⾏来⼀⾏代码,解释⼀⾏,⼤部分不常⽤的代码,都是采⽤这种⽅式。即使编译对于部分热点代码,将⼀个⽅法包含的所有字节码翻译成机器指令,以提⾼java虚拟机的运⾏效率。即时编译是建⽴经典的⼆⼋定律上,即20%代码占据了80%的计算资源。执⾏指令Java程序被加载⼊内存后,指令也在内存中了。指令的指令寄存器IP,指向下⼀条待执⾏指令的地址。CPU的控制单元根据IP寄存器的指向,将主存中的指令装载到指令寄存器,这些加载的指令就是⼀串⼆进制码,还需要译码器进⾏解码。解码后,如果需要获取操作数,则从内存中取数据,调⽤运算单元进⾏计算。多线程上下⽂切换CPU⼀通上电,就会周⽽复始从内存中获取指令、译码、执⾏。为了⽀持多任务,CPU 将执⾏时间这个资源划分成时间⽚,每个程序执⾏⼀段时间。java虚拟机的多线程是通过线程轮流切换分配处理执⾏时间的⽅式来实现的,在任何⼀个确定的时刻,⼀个处理器(对于多核处理器来说是⼀个内核)都只会执⾏⼀条程序中的指令。假设当前线程在运⾏中,CPU分配的时间执⾏完了,总得保存运⾏过的结果信息吧,要不然⽩⽩浪费之前的⼯作了,因此,程序计数器(PC寄存器)作⽤体现出来了,它是⼀块较⼩的内存空间,线程私有,可以看作当前线程执⾏的字节码的⾏号指⽰器。当CPU⼜给它分配时间跑的时候,可以把数据恢复,接着上⼀次执⾏到的位置继续执⾏就可以了。参考与感谢《深⼊理解Java虚拟机》JVM系列:(⼀)Java代码是怎么运⾏的个⼈公众号觉得写得好的⼩伙伴给个点赞+关注啦,谢谢~如果有写得不正确的地⽅,⿇烦指出,感激不尽。同时⾮常期待⼩伙伴们能够关注我公众号,后⾯慢慢推出更好的⼲货~嘻嘻

2023年6月20日发(作者:)

java流程代码怎么写_Java程序员必备基础:Java代码是怎么运⾏的?前⾔作为⼀名Java程序员,我们需要知道Java代码是怎么运⾏的。最近复习了深⼊理解Java虚拟机,做了⼀下总结,希望对⼤家有帮助,如果有不正确的地⽅,欢迎提出,感激不尽。java 代码运⾏主要流程本⽂主要讲解流程如下:java源⽂件编译为class字节码类加载器把字节码加载到虚拟机的⽅法区。运⾏时创建对象⽅法调⽤,执⾏引擎解释为机器码CPU执⾏指令多线程切换上下⽂编译我们都知道,java代码是运⾏在Java虚拟机上的。但是java是⼀门⾯向对象的⾼级语⾔,它不仅语法⾮常复杂,抽象程度也⾮常⾼,并不能直接运⾏在计算机硬件机器上。Java虚拟机(Java Virtual Machine 简称JVM)是运⾏所有Java程序的抽象计算机,是Java语⾔的运⾏环境。因此,在运⾏Java程序之前,需要编译器把代码编译成java虚拟机所能识别的指令程序,这就是Java字节码,即class⽂件。所以,Java代码运⾏的第⼀步是:把Java源代码编译成.class 字节码⽂件。类加载在Class⽂件中描述的各种信息,需要被加载到虚拟机之后才能运⾏和使⽤。因此,需要把class字节码⽂件加载到Java虚拟机来。虚拟机把描述类的数据从 Class ⽂件加载到内存,并对数据进⾏校验、转换解析和初始化,最终形成可以被虚拟机直接使⽤的 Java 类型,这就是虚拟机的类加载机制。加载在加载阶段,虚拟机需要完成以下3件事情:通过⼀个类的全限定名来获取定义此类的⼆进制字节流。将这个字节流所代表的静态存储结构转化为⽅法区的运⾏时数据结构。在内存中⽣成⼀个代表这个类的对象,作为⽅法区这个类的各种数据的访问⼊⼝加载阶段完成后,这些⼆进制字节流按照虚拟机所需的格式存储在⽅法区之中。验证为了确保Class⽂件的字节流中包含的信息符合当前虚拟机的要求,不会危害虚拟机的安全,Java虚拟机对输⼊的字节流⾛验证过程。验证阶段包括四个阶段:⽂件格式验证、元数据验证、字节码验证、符号引⽤验证。⽂件格式验证: 验证字节流是否符合Class⽂件格式规范,如:是否以魔数0xCAFEBABE开头。元数据验证: 对字节码描述的信息进⾏语义分析,如:这个类的⽗类是否继承了不允许被继承的类(被final修饰的类);字节码验证: 主要⽬的是通过数据流和控制流分析,确定程序语义是合法的、符合逻辑的。如:保证跳转指令不会跳转到⽅法体以外的字节码指令上。符号引⽤验证: 发⽣在虚拟机将符号引⽤转化为直接引⽤的时候,如:校验符号引⽤中通过字符串描述的全限定名是否能找到对应的类。准备准备阶段是正式为类变量分配内存并设置类变量初始值,这些变量所使⽤的内存都将在⽅法区中进⾏分配。如:publicstaticintvalue=123;变量value在准备阶段过后的初始值是0⽽不是123。解析解析阶段是虚拟机将常量池内的符号引⽤替换为直接引⽤的过程。⽐如:类引⽤类,在编译时,User类不知道Tool类的实际内存地址,因此只能使⽤符号(假设)来表⽰。⽽在类加载加载User类的时候,可以通过虚拟机获取Tool类的实际内存地址,因此便可以将符号替换为Tool类的实际内存地址,即直接引⽤地址。解析动作主要针对类或接⼝、字段、类⽅法、接⼝⽅法、⽅法类型、⽅法句柄和调⽤点限定符 7 类符号引⽤进⾏。初始化到了初始化阶段,才真正开始执⾏类中定义的Java字节码。在这个阶段,则根据程序员通过程序制定的主观计划去初始化类变量和其他资源。创建对象Java虚拟机是如何执⾏字节码的呢?我们先来看⼀下运⾏时创建对象。Java是⾯向对象的编程语⾔,程序的运⾏是以对象为调⽤单位的。字节码⽂件加载到虚拟机的⽅法区后,在程序运⾏过程,通过 class字节码⽂件创建与其对应的对象信息 。创建对象的⽅式有:new关键字,反射等。Java堆内存是线程共享的区域,创建后的对象信息就保存在Java堆内存中。⽅法调⽤JVM的调⽤单位是对象,但是真正执⾏功能性的代码还是对象上的⽅法。在运⾏过程中,每当调⽤进⼊⼀个java⽅法,java虚拟机会在当前线程的java⽅法栈中⽣成⼀个栈帧,⽤以存放局部变量以及字节码的操作数。⽅法栈内存是线程私有的,每个线程都有⾃⼰的⽅法栈。如果对应的⽅法是本地⽅法,则对应的就是本地⽅法栈。java运⾏时数据区域如下:解释当调⽤Java对象的某个⽅法时,JVM执⾏引擎会将该⽅法的字节码⽂件翻译成计算机所能识别的机器码,机器码信息保存在⽅法区中。翻译有解释执⾏和即时编译两种⽅式。两种翻译⽅式的区别如下:解释执⾏来⼀⾏代码,解释⼀⾏,⼤部分不常⽤的代码,都是采⽤这种⽅式。即使编译对于部分热点代码,将⼀个⽅法包含的所有字节码翻译成机器指令,以提⾼java虚拟机的运⾏效率。即时编译是建⽴经典的⼆⼋定律上,即20%代码占据了80%的计算资源。执⾏指令Java程序被加载⼊内存后,指令也在内存中了。指令的指令寄存器IP,指向下⼀条待执⾏指令的地址。CPU的控制单元根据IP寄存器的指向,将主存中的指令装载到指令寄存器,这些加载的指令就是⼀串⼆进制码,还需要译码器进⾏解码。解码后,如果需要获取操作数,则从内存中取数据,调⽤运算单元进⾏计算。多线程上下⽂切换CPU⼀通上电,就会周⽽复始从内存中获取指令、译码、执⾏。为了⽀持多任务,CPU 将执⾏时间这个资源划分成时间⽚,每个程序执⾏⼀段时间。java虚拟机的多线程是通过线程轮流切换分配处理执⾏时间的⽅式来实现的,在任何⼀个确定的时刻,⼀个处理器(对于多核处理器来说是⼀个内核)都只会执⾏⼀条程序中的指令。假设当前线程在运⾏中,CPU分配的时间执⾏完了,总得保存运⾏过的结果信息吧,要不然⽩⽩浪费之前的⼯作了,因此,程序计数器(PC寄存器)作⽤体现出来了,它是⼀块较⼩的内存空间,线程私有,可以看作当前线程执⾏的字节码的⾏号指⽰器。当CPU⼜给它分配时间跑的时候,可以把数据恢复,接着上⼀次执⾏到的位置继续执⾏就可以了。参考与感谢《深⼊理解Java虚拟机》JVM系列:(⼀)Java代码是怎么运⾏的个⼈公众号觉得写得好的⼩伙伴给个点赞+关注啦,谢谢~如果有写得不正确的地⽅,⿇烦指出,感激不尽。同时⾮常期待⼩伙伴们能够关注我公众号,后⾯慢慢推出更好的⼲货~嘻嘻