计算机为何可以运行java代码,java网上下载的代码如何运行

Java代码有很多种不同的运行方式。比如说可以在开发工具中运行,可以双击执行jar文件运行,也可以在命令行中运行,甚至可以在网页。这些执行方式都离不开JRE,Java运行时环境。

JRE仅包含运行Java程序的必需组件,包括Java虚拟机以及Java核心类库等。我们Java程序员经常接触到的JDK(Java开发工具包)同样包含了JRE,并且还附带了一系列开发、诊断工具。

然而,运行C 代码则无需额外的运行时。往往把这些代码直接编译成CPU所能理解的代码格式,即机器码。

比如下图的中间列,就是用C语言写的Helloworld程序的编译结果。C程序编译而成的机器码就是一个个的字节,它们是给机器读的。那为让开发人员也能理解,用反汇编器将其转换成汇编代码(如下图的最右列所示)。

; 最左列是偏移;中间列是给机器读的机器码;最右列是给人读的汇编代码0x00: 55 push rbp0x01: 48 89 e5 mov rbp,rsp0x04: 48 83 ec 10 sub rsp,0x100x08: 48 8d 3d 3b 00 00 00 lea rdi,[rip 0x3b] ; 加载"Hello, World!n"0x0f: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x00x16: b0 00 mov al,0x00x18: e8 0d 00 00 00 call 0x12 ; 调用printf方法0x1d: 31 c9 xor ecx,ecx0x1f: 89 45 f8 mov DWORD PTR [rbp-0x8],eax0x22: 89 c8 mov eax,ecx0x24: 48 83 c4 10 add rsp,0x100x28: 5d pop rbp0x29: c3 ret为什么Java要在虚拟机里运行?

Java作为一门高级程序语言,它的语法非常复杂,抽象程度也很高。因此,直接在硬件上运行这种复杂的程序并不现实。所以呢,在运行Java程序之前,需要对其进行一番转换。

转换怎么操作

设计一个面向Java语言特性的虚拟机,并通过编译器将Java程序转换成该虚拟机所能识别的指令序列,即Java字节码。之所以这么取名,是因为Java字节码指令的操作码(opcode)被固定为一个字节。

下图的中间列,正是用Java写的Helloworld程序编译而成的字节码。可以看到,它与C版本的编译结果一样,都是由一个个字节组成的。同样可以将其反汇编为人类可读的代码格式(如下图的最右列所示)。Java版本的编译结果相对精简一些,Java虚拟机相对于物理机而言,抽象程度更高。

# 最左列是偏移;中间列是给虚拟机读的机器码;最右列是给人读的代码0x00: b2 00 02 getstatic java.lang.System.out0x03: 12 03 ldc "Hello, World!"0x05: b6 00 04 invokevirtual java.io.PrintStream.println0x08: b1 return

Java虚拟机常见的是在各个现有平台(如Windows_x64、Linux_aarch64)上提供软件实现。一旦一个程序被转换成Java字节码,便可在不同平台上的虚拟机实现里运行,即“一次编写,到处运行”。

虚拟机的另外一个好处是它带来托管环境(Managed Runtime),代替我们处理一些代码中冗长而且容易出错的部分。自动内存管理与垃圾回收,这部分内容甚至催生了一波垃圾回收调优。

托管环境还提供了诸如数组越界、动态类型、安全权限等等的动态检测。

Java虚拟机具体是怎样运行Java字节码的?

以标准JDK中的HotSpot虚拟机为例,从虚拟机以及底层硬件两个角度,给你讲一讲Java虚拟机具体是怎么运行Java字节码的。

虚拟机视角,执行Java代码首先要将它编译而成的class文件加载到Java虚拟机。加载后的Java类会被存放于方法区(Method Area)。实际运行时,虚拟机会执行方法区内的代码。

这和段式内存管理中的代码段类似。而且,Java虚拟机同样也在内存中划分出堆和栈来存储运行时数据。

但Java虚拟机会将栈细分为面向Java方法的Java方法栈,面向本地方法(用C 写的native方法)的本地方法栈,以及存放各个线程执行位置的PC寄存器。

运行过程中,每当调用进入一个Java方法,Java虚拟机会在当前线程的Java方法栈中生成一个栈帧,存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且Java虚拟机不要求栈帧在内存空间里连续分布。

当退出当前执行的方法时,不管是正常返回、异常返回,Java虚拟机均会弹出当前线程的当前栈帧,并舍弃。

硬件视角,Java字节码无法直接执行。因此,Java虚拟机需要将字节码翻译成机器码。HotSpot翻译过程有两种形式:

解释执行,逐条将字节码翻译成机器码并执行无需等待编译即时编译(Just-In-Time compilation,JIT),将一个方法中包含的所有字节码编译成机器码后再执行实际运行速度更快HotSpot默认采用混合模式,综合了解释执行和即时编译两者的优点:先解释执行字节码,而后将其中反复执行的热点代码,以方法为单位进行即时编译。Java虚拟机的运行效率

HotSpot采用了多种技术来提升启动性能以及峰值性能,即时编译便是其中最重要的技术之一。

即时编译建立在程序符合二八定律,百分之二十的代码占据了百分之八十的计算资源。

对占据大部分的不常用的代码,无需耗费时间将其编译成机器码,而是采取解释执行的方式运行对于仅占据小部分的热点代码,我们则可以将其编译成机器码,以达到理想运行速度。

理论即时编译后的Java程序的执行效率,是可能超过C 。因为与静态编译相比,即时编译拥有程序的运行时信息,并且能够根据这个信息做出相应的优化。虚方法是用来实现多态性。对一个虚方法调用,尽管有很多目标方法,但实际运行过程中,可能只调用其中一个。

这信息可被即时编译器所利用,规避虚方法调用的开销,达到比静态编译的C 程序更高的性能。

为满足不同用户场景的需要,HotSpot内置了多个即时编译器:C1、C2和Graal。Graal是Java 10正式引入的实验性即时编译器。

之所以引入多个即时编译器,为在编译时间和生成代码的执行效率之间进行取舍。C1又叫做Client编译器,面向对启动性能有要求的客户端GUI程序,采用的优化手段相对简单,因此编译时间较短。C2又叫做Server编译器,面向对峰值性能有要求的服务器端程序,采用的优化手段相对复杂,因此编译时间较长,但同时生成代码的执行效率较高。

从Java 7开始,HotSpot默认采用分层编译的方式:热点方法首先会被C1编译,而后热点方法中的热点会进一步被C2编译。为了不干扰应用的正常运行,HotSpot的即时编译是放在额外的编译线程中进行的。HotSpot会根据CPU的数量设置编译线程的数目,并且按1:2的比例配置给C1及C2编译器。在计算资源充足的情况下,字节码的解释执行和即时编译可同时进行。编译完成后的机器码会在下次调用该方法时启用,以替换原本的解释执行。

总结

在虚拟机中运行,是因为它提供了可移植性。一旦Java代码被编译为Java字节码,便可以在不同平台上的Java虚拟机实现上运行。此外,虚拟机还提供了一个代码托管的环境,代替我们处理部分冗长而且容易出错的事务,例如内存管理。

Java虚拟机将运行时内存区域划分为五个部分,分别为方法区、堆、PC寄存器、Java方法栈和本地方法栈。Java程序编译而成的class文件,需要先加载至方法区中,方能在Java虚拟机中运行。

为了提高运行效率,标准JDK中的HotSpot虚拟机采用的是一种混合执行的策略。

它会解释执行Java字节码,然后会将其中反复执行的热点代码,以方法为单位进行即时编译,翻译成机器码后直接运行在底层硬件之上。

HotSpot装载了多个不同的即时编译器,以便在编译时间和生成代码的执行效率之间做取舍。

参考

[1]https://en.wikipedia.org/wiki/Java_processor

[2]https://wiki.openjdk.java.net/display/CodeTools/asmtools

计算机为何可以运行java代码,java网上下载的代码如何运行

java工作原理

Java工作原理
由四方面组成:
(1)Java编程语言
(2)Java类文件格式
(3)Java虚衡冲拟机
(4)Java应用程序接口
当编辑并运行一个Java程序时,姿物需要同时涉及到这四种方面。使用文字编辑软件(例如记事本、写字板、UltraEdit等)或集成开发环境(Eclipse、MyEclipse等咐册歼)在Java源文件中定义不同的类 ,通过调用类(这些类实现了Java API)中的方法来访问资源系统,把源文件编译生成一种二进制中间码,存储在class文件中,然后再通过运行与操作系统平台环境相对应的Java虚拟机来运行class文件,执行编译产生的字节码,调用class文件中实现的方法来满足程序的Java API调用 。

计算机为何可以运行java代码,java网上下载的代码如何运行

Java语言广泛使用的原因是什么?

很多人都知道,计算机的发展是非常快的,如果自己对知识的吸收不能跟上计算机的发展,那么很快就会被整个行业所淘汰。新技术不断覆盖老技术,一些技术已经开始没有价值,那么如何才能在计算机行业站立不倒呢?下面键做电脑培训为大家介绍Java地位一直无法撼动的原因。

一、在市场竞争中不屈不挠

在很早之前技术界从来没有想过Java会成功,但是在有很多竞争对手的情况下,它仍然蓬勃发展。那些仍然对Java感到惊讶的人仍然不太清楚为什么Java会成功。微软是Java中第一个强大的对手,因为当时MS-DOS提供了多功能性,很多人认为Java是这种多功能性产品最有可能替代的。并且在Java内部也存在很多的斗争,尽管存在很多问题,但是Java依然在快速发展中,满足很多应用领域的需求。


二、Java虚拟机的优化线程

Java虚拟机的最大的优势是多线程控制。JVM针对大型多核计算机上可以进行数百个线程的稳定性优化。其他语言将提出交叉编译器和模拟器,以便在JVM上进行运行。Java的这种能力也吸引了很多高流量的网站。并且IT培训发现它还可以在桌面上进行开发并将其放在服务器上以制作JVM多核。

三、成为初学者的语言

Java被用于大学计算机课程里,很多大学生开始接触的计算机语言就是Java。很多人都知道先入为主的道理,Java学习能够让每个人留下深刻的印象,就算在后期学习其他语言,在思考的过程中也会受到Java语言的影悉悔响。

四、具有跨平台兼容性

虽然Java不是第一种提供跨平台兼容性的语言,但Java已稿陆衡成为最受欢迎的跨平台编程工具,而Sun和Oracle则是一种支持跨平台使用的程序。当程序无法在多个平台上使用时,出现这种问题的原因通常是可以进行解决的。


五、移动端的成功

虽然Java没有在大型网站的应用程序中体现到非常好,但是在移动端开发市场得到快速发展。移动端平台主要是使用Java进行构建,并且如今的销量是非常高的,Java语言能够广泛应用在手机上,是现在发展的大趋势。

其实Java也存在一些自身的问题,在进行语言开发的过程中存在很多缺陷,在进行学习过程中,掌握语言开发是非常重要的,沙河北大青鸟认为选择适合自己的开发一样,并且关注其他开发程序,对学习软件开发有很大的帮助。


上一篇: 女销售原来靠这样卖房(楼盘置业顾问提成大概多少)
下一篇: 企业支付咨询费的涉税及会计处理办法「企业支付咨询费的涉税及会计处理」