JVM的入门(一)

机器码和字节码的区别

相信很多小伙伴有这样的疑问,明明都是二进制文件为什么字节码还需要jvm引擎编译成机器码之后才能被操作系统识别。
大学计算机组成原理确实都还给老师了,惭愧!!!

在这里插入图片描述

机器码就是说计算机能读懂的代码,简单点说就是给计算机执行的二进制代码.
字节码,是JAVA语言专有的,它是让JVM来执行的二进制代码。jvm被称为java 虚拟机,它也可以被当成计算机,要想被jvm识别,也就只有二进制文件了。只不过由于jvm的
虽然都是二进制代码,但是由于执行它的环境不一样,所以它们存在一些指令集上的区别,也就是说就算给了一条汇编指令abc,最后cpu进过计算得到的值在不同的环境上是不同的。


一,机器码,完全依附硬件而存在~并且不同硬件由于内嵌指令集不同,即使相同的0 1代码 意思也可能是不同的~换句话说,根本不存在跨平台性~比如~不同型号的CPU,你给他个指令10001101,他们可能会解析为不同的结果~
二,我们知道JAVA是跨平台的,为什么呢?因为他有一个jvm,不论那种硬件,只要你装有jvm,那么他就认识这个JAVA字节码~~~~至于底层的机器码,咱不用管,有jvm搞定,他会把字节码再翻译成所在机器认识的机器码~~~
用比较通俗移动的话来讲就是

java为什么是跨平台的?

在这里插入图片描述
解释:上面的图是从上往下依次调用的关系。

操作系统(Windows/Linux)管理硬件,让硬件能够正常、合理的运行,当然各种硬件的驱动实现了操作系统的接口,操作系统调用这些接口就能管理硬件,操作系统还像程序员提供了一层接口,叫做系统呼叫层,程序员可以面向这一层的接口编程,来实现对计算机的控制,而不同的操作系统(或者说不同的CPU架构)所提供的接口都是不一样的,Windows和Linux提供给的那肯定是完全不一样的,虽然站在最终的角度来看都能实现某一功能。所以同样一个程序是不能在不同的系统上运行的,甚至可能在同一个系统的不同版本都不一定能完美运行,这就是所谓的平台相关的程序,比如C/C++程序,然而计算机和互联网的飞速发展,计算机种类和型号千千万,操作系统也有很多种类,Window、Linux、iOS等,同样一款软件不能不做改变就在不同的操作系统上面运行,这对开发者来说不是很友好。Java语言就能解决这个问题(说成是Java平台更准确,JVM+JavaAPI),鉴于不同的操作系统所需要的程序是不一样的,那么就可以寻找一个方法来解决这个问题,于是JVM就诞生了,又JVM来向下关联所有操作系统,他能操作所有操作系统,向上提供统一接口,也就是JavaAPI,开发者只需要面向JVM(JavaAPI)编程,至于JVM是如何各种不同的操作系统打交道开发者完全不用管,管他是怎么沟通交流的,于是只要面向JVM+JavaAPI编程,一个程序可以在任意操作系统平台上面运行,这就是所谓的跨平台,Java代码和平台是无关的,没有任何关系。—而这,就是Java的跨平台性质。
任何一个程序都会操作计算机硬件的,由于不同操作系统硬件其cpu中的指令集不同,最后翻译得到的结果也是不同的。所以这就是导致C++程序在不同操作系统无法成功运行的原因。而java程序先编译成class字节码文件后,经过jvm再次编译,成为了机器码文件,这种机器码文件是不需要经过cpu指令集来计算的,可以直接被计算机识别,所以这就是C++无法跨平台,java可以跨平台的主要原因。
ps:指令集是什么

题外话,关于我的理解,我们对于计算机的操作,事实上都是对内存模型(或者说内存的数据结构)在操作,CPU和内存的通信会触发计算机相关的硬件控制,内存变化的时候他会给CPU发送信号,然后CPU执行相关的操作显示到显示器上面。内存首先是建立操作系统的内存模型,然后其他内存模型都建立在操作系统的内存模型之上或者跟操作系统内存模型有关。就包括JVM的内存模型,当我们操作数据的时候,JVM内存模型发生变化,从而控制操作系统,操作系统跟CPU之间完成非常复杂的沟通,然后得出结果,从IO送出信号。而这一切的一切在计算机内部都是所谓的二进制在运行,再向下一点,就是无数个高低电平的变化。而我们的代码其实就是这些内存模型的另一种表示方法,这种表示方法可以让人很容易看懂和改变。我们平常所谓的内存,硬盘这些数据和控制都是逻辑性的,这让人才容易懂,而转换到底层就是物理性的。举个例子:我们平常的String str = “123”,我们人看懂,字符串str赋值123,那么当我们在eclipse中输入String str = "123"点点击Ctrl + S保存,其实CPU和内存之间已经经过了无数次沟通,首先会把"123"转换成二进制,从而保存在硬盘上面的,当我们的JVM开始运行之后,从硬盘把"123"加载内存,当我们调用str这个引用的时候,内存会把"123"在内存中的的数据结构通过高低电平传给cpu,cpu做出运算,控制之后会通过IO,把信号送到屏幕,当然,还需要经过显卡,然后屏幕通过送过来的信号拉扯液晶,从而屏幕上面显示"123"字样。总之一句话,计算机软件其实就是无数次的改变内存模型,我们操作的其实都是内存。

机器语言、汇编语言、高级语言

比如 java这种高级语言,它的操作流程最终还是按照下图
在这里插入图片描述
汇编语言的产生,首先要讲一下机器语言。机器语言是机器指令的集合。机器指令展开来讲就是一台机器可以正确执行的命令。电子计算机的机器指令是一列二进制数字。计算机将之转变为一列高低电平,以使计算机的电子器件受到驱动,进行运算。

   上面所说的计算机指的是可以执行机器指令,进行运算的机器。这是早期计算机的概念。在我们常用的PC机中,有一个芯片来完成上面所说的计算机的功能。这个芯片就是我们常说的CPU(Central Processing Unit,中央处理单元)。每一种微处理器,由于硬件设计和内部结构的不同,就需要用不同的电平脉冲来控制,使它工作。所以每一种微处理器都有自己的机器指令集,也就是机器语言。CPU 只负责计算,本身不具备智能。你输入一条指令(instruction),它就运行一次,然后停下来,等待下一条指令。这些指令都是二进制的,称为操作码(opcode),比如加法指令就是00000011。编译器的作用,就是将高级语言写好的程序,翻译成一条条操作码。对于人类来说,二进制程序是不可读的,根本看不出来机器干了什么。为了解决可读性的问题,以及偶尔的编辑需求,就诞生了汇编语言。汇编语言是二进制指令的文本形式,与指令是一一对应的关系。比如,加法指令00000011写成汇编语言就是 ADD。只要还原成二进制,汇编语言就可以被 CPU 直接执行,所以它是最底层的低级语言。

   早期的程序设计均使用机器语言。程序员们将用0, 1数字编成的程序代码打在纸带或卡片上,1打孔,0不打孔,再将程序通过纸带机或卡片机输入计算机,进行运算。这样的机器语言由纯粹的0和1构成,十分复杂,不方便阅读和修改,也容易产生错误。程序员们很快就发现了使用机器语言带来的麻烦,它们难于辨别和记忆,给整个产业的发展带来了障碍,于是汇编语言产生了。

   汇编语言的主体是汇编指令。汇编指令和机器指令的差别在于指令的表示方法上。汇编指令是机器指令便于记忆的书写格式。

操作:寄存器BX的内容送到AX中
1000100111011000 机器指令
mov ax,bx 汇编指令
此后,程序员们就用汇编指令编写源程序。可是,计算机能读懂的只有机器指令,那么如何让计算机执行程序员用汇编指令编写的程序呢?这时,就需要有一个能够将汇编指令转换成机器指令的翻译程序,这样的程序我们称其为编译器。程序员用汇编语言写出源程序,再用汇编编译器将其编译为机器码,由计算机最终执行。

java代码的执行流程

在这里插入图片描述
如上图,将java源码编译为字节码文件之后,会经过类加载器和字节码加载器的,最后由jvm执行引擎翻译执行。在整个流程中,其实有两个编译过程,第一个是javac编译成字节码文件,第二个是jvm将字节码文件编译成机器码供操作系统识别。

jvm的架构模型

java编译器输入的指令流基本上是一种基于栈的指令架构,另外一种指令集架构则是基于寄存器的指令集架构(寄存器是cpu的组成部分)。
基于栈的特点:
1.不需要硬件支持,可移植性更好,更好实现跨平台
2.执行速度不如基于寄存器的
基于寄存器的指令架构特点
1.需要硬件支持,无法跨平台
2.执行速度较快

当然还有其它的特点,这里涉及到计算机组成原理了,难以理解,就不写在这里了。

JVM的生命周期

虚拟机的启动:
在这里插入图片描述

总结就是 正常场景下,虚拟机的执行和退出其实就是程序的执行和结束,只不过虚拟机的启动不是先加载应用程序类,它是先加载引导类。

在这里插入图片描述

通过jps命令查看当前java程序执行的进程,过了6秒之后再此查看,发现进程不在了(程序执行完毕了)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值