Java代码是如何运行的

123 篇文章 0 订阅
96 篇文章 2 订阅
本文探讨了Java与C++的区别,强调Java的跨平台性和托管环境。Java字节码在虚拟机中运行,确保了平台独立性,并通过垃圾回收简化内存管理。HotSpot虚拟机的解释执行和编译执行策略平衡了启动速度和运行效率。文章还概述了Java虚拟机如何加载和执行字节码,涉及方法区、堆、栈和PC寄存器等关键概念。
摘要由CSDN通过智能技术生成

问题一:Java与C++区别

1.Java需要运行时环境,包括Java虚拟机以及Java核心类库等。

2.C++无需额外的运行时,通常编译后的代码可以让机器直接读取,即机器码

问题一:Java为什么要在虚拟机运行?

1.一次编译,到处运行。

这里涉及到一个概念:字节码。

Java字节码指的是设计一个面向Java特性的虚拟机,通过编译器将Java程序转换成该虚拟机所能识别的指令序列。

为什么是叫字节码呢?原因还是Java 字节码指令的操作码(opcode)被固定为一个字节。

2.托管环境。

虚拟机能够代替我们处理一些代码中冗长而且容易出错的代码的部分,比如C++中经常出现的垃圾回收问题,程序员经常忘记回收垃圾。

另外,虚拟机还为我们提供了如数组越界,动态类型等动态检测,极大地降低了Java开发的难度。

问题二:Java虚拟机具体是如何运行Java字节码的?

以Hotspot虚拟机为例子,Java虚拟机细分为方法区、堆、Java方法栈、面向本地方法的本地方法栈、PC寄存器
在这里插入图片描述
从虚拟机的视角看,

1.执行Java代码首先需要将它编译成class文件加载到Java虚拟机中,加载后的Java类会被保存到方法区中。实际运行时,虚拟机会执行方法区中的代码。

2.上图中的堆和栈是用来存储运行时数据的。其中,栈被分成了面向Java方法的Java方法栈和面向本地方法(C++写的native方法)本地方法栈,以及存放各个线程执行位置的PC寄存器

3.在运行过程中,每当调用一个方法,虚拟机就会在当前线程的Java方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。当方法执行完毕之后,该栈帧也随着被弹出。

从硬件角度看,
在这里插入图片描述
在HotSpot里面,编译Java代码有两种方式,一种是解释执行,另一种是编译执行。

解释执行:逐条将字节码翻译成机器码并执行(边翻译边读)

编译执行:将一个方法中包含的所有字节码编译成机器码之后执行。(翻译完之后,再读)

前者优势在于:无需等待编译完全

后者优势在于:热点代码比较多的时候,读取的执行效率快于前者。

HotSpot使用的是多个即时编译器共同协作:C1,C2,和Java10正式使用的Graal。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值