Java字节码文件(.class)结构略解0-一个Java程序的一生

背景(一个Java程序的一生,从编写到执行)

​ 先来回顾一下一个java程序的一生吧,首先有程序员写出源代码(.java);

​ 然后通过javac这个编译器,将源代码编译为字节码(.class),字节码本身具有平台无关性和图灵完备性,包含指令和数据,本质上只要能将程序翻译(这不是经典意义上的编译)为相应的字节码,任何程序都能在jvm上运行(包括其他语言所写的程序,有兴趣可以看看GraallVM,我没有研究过这个东西😂);

​ class文件中并不是机器指令,不能直接加载到内存中供cpu执行,需要一个虚拟机,即jvm。在jvm执行class文件中(这个说法不准确,不过为了快速推进就先这样理解吧)时,有两种方式:

​ 一是解释执行,即取出class中的一条指令,再由jvm执行这条指令(jvm本质是还是使用相应的机器指令执行这些指令,因为需要将每条class中的指令借由jvm这个词典,转换到对应的机器指令上,这个过程很像将字节码说的外语解释成机器所能接受的本地语言,所以称为解释执行),因为每条指令都需要”解释“,所以在效率上有较大的损失,(如果再配合上python默认的那种像是单线程的解释器,使用体验将是相当糟糕的),之前因为Java代码只能以这种方式被执行,所以给人慢的印象。

​ 二是编译执行,先将class中一部分指令转换成相应的机器指令,执行时再调用这些机器指令。这样的话,每次执行相应指令的速度确实是快了,但是这也会有一个问题,就是编译这个行为是需要耗时的,如果全部编译的话,它的启动时间将是难以忍受的(可以参考一下你第一次在ide中运行一个项目时生成class文件的时间,将class中全部指令编译成机器指令的时间可能比那个还长),于是jvm采取了热点编译的策略,编译需要多次执行的那些代码。

posted @ 2021-07-25 10:23  Kicey  阅读(90)  评论(0)    收藏  举报