JVM是什么
虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
所谓的java虚拟机,就是一台虚拟的机器。它是一款软件,用来执行一系列虚拟计算机指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机。visual Box、VMare就属于系统虚拟机。他们完全是对物理计算机的仿真,提供一个可运行完整操作系统的软件平台。而java虚拟机就是典型程序虚拟机,它专门为执行单个计算机程序而设计,在java虚拟机中执行的指令我们称之为java字节码指令。
比如一台服务器上运行着两个用Java编写的程序,一个博客系统,一个电商系统,那么这两个Java程序、Java虚拟机、服务器之间是什么关系呢?
从上图可以看出来,Java写的博客系统,电商系统都是运行在jvm之上,这两个Java程序启动也对应着会启动两个JVM实例。JVM是运行在服务器的系统之上,服务器可以是linux系统,可以是windows系统,可以是centos系统,各种系统都可以。这也就是常说的Java是一次编译到处运行。可能这么说还是不通俗易懂,至少我刚开始学Java的时候我的老师这么说我就没有理解。那么我就说说我自己工作后的理解。
我们跑Java程序之前首先肯定是装jdk,我们在windows装jdk环境是用的windows版本的jdk,在linux上装jdk用的linux版本的jdk;jdk我们就可以理解为由Java程序设计语言、Java虚拟机、Java类库组成(Java Development kit)。我们写的Java程序可以在服务器上跑的前提是这个服务器装了jdk环境。也就是只要是服务器装了jdk环境,我们用maven或者gradle或者其他工具编译打包好的Java程序jar包就可以直接运行,我不需要在Java程序里面去适配你的windos环境还是linux环境还是centos环境。
jvm和Java的关系
jvm和Java是什么关系呢,jvm和Java是不是只能相互依存呢?我刚开始学Java的时候接触到jvm,我就说这么认为的,因为jvm又叫Java虚拟机,所以我认为jvm就是专门为Java设计的。Java有Java自己的规范,根据这个规范也衍生出多种不同的jdk,比如Oracle的jdk,sun的jdk(sun已经被oracle收购)IBM的jdk;虚拟机也有虚拟机自己的规范,根据这个规范也衍生出了多种不同的虚拟机,比如:武林盟主HotSpot虚拟机,小家碧玉Mobile Embedded VM,天下第二BEA JRockit/IBM J9虚拟机等。但是2018年4月,Oracle Labs新出了一个虚拟机Graal VM,口号是:“Run Programs Faster Anywhere”与Java刚诞生时候的“Write Once,Run Anywhere”遥相呼应,Graal VM是一个增强版虚拟机,可以作为“任何语言”的运行平台使用,这里“任何语言”包括了Java、Scala、Groovy、Kotlin等基于Java虚拟机之上的语言,还包括了C、C++、Rust等基于LLVM的语言,同时支持其他像JavaScript、Ruby、Python和R语言等。Graal VM可以无额外开销地混合使用这些编程语言,支持不同语言中混用对方的接口和对象,也能够支持这些语言使用已经编写好的本地库文件。
虚拟机的介绍就先说到这,相信聪明的你已经对虚拟机有一个大致的认识,下一章将虚拟机的内存结构,这也是现在Java面试的高频题,但是大多数人肯定都只是了解堆,栈,程序计数器,本地方法栈,然后再了解一下堆中分了年轻代,老年代这些,这也是培训机构教jvm部分的模板,但是每年培训出那么多人,你难道就不想比他们多知道那么一点吗?各位人才应该都懂的,我们下一章见。
各位人才,各位大佬,有不对的地方各位请不吝指教!都看到这儿了,点赞收藏转发三连一下?祝各位早日找到女朋友。喜欢的朋友可以关注一下我的公众号敲代码的蛋蛋,一起成长,一起骚起来呀!!!
我是敲代码的蛋蛋,一个努力触摸编程门栏的新手。今天的你是否比昨天的你更优秀了呢?
参考文档:
<<深入理解Java虚拟机>> ----周志明
<<百度百科>>