从上层应用程序到底层操做系统,到底有哪些东西?html
平时开发的应用程序主要基于各类框架,譬如Spring
,SpringMVC
,Mybatis
,而各类框架又是基于Java API
来实现的,Java API
调用执行是在JVM
上的,而JVM
则是运行在操做系统上的,操做系统是在物理机器打交道的。前端
在框架上进行业务开发,或者学习框架如何使用,是大部分开发者的工做。可是实际上咱们不应执着于框架该如何使用,而是应该往下走,通常最后遇到的问题都会到JVM
和操做系统的问题。即便如今的 JVM
已经很完善,帮开发者作了不少事,可是咱们不应以此为理由不去了解 JVM
的原理。架构师把开发者变成温室里的花朵和温水里的青蛙,若是有一天出现如下问题,该怎么解决:java
OOM
。GC
(垃圾回收)有问题,须要 dump
内存,进行分析。JVM
的参数。JVM
参数调优。几乎全部的高级语言在交给机器CPU执行以前,都会经历 高级语言 --> 汇编语言 --> 机器指令 的过程,由于计算机是不会直接识别高级语言的。了解高级语言如何转换成能被机器识别的语言,是开发者必须掌握的技能。面试
Java
比C++
多了动态内存分配以及垃圾回收技术,Java
的虚拟机帮开发者作了垃圾收集,编译优化等一系列工做,里面的垃圾收集算法有哪些?怎么执行的?JIT
编译器是怎么工做的?这些每每也是面试常谈的话题。懂得JVM
的内部机构和工做机制,有利于设计高拓展的应用和快速诊断运行时的问题。算法
去官网找虚拟机规范(英文版):
https://www.oracle.com/cn/java/technologies/javase-downloads.html编程
找到:Java Language and Virtual Machine Specifications
:
后端
打开以后是:https://docs.oracle.com/javase/specs/index.html ,也就是Java语言和虚拟机的规范。架构
能够选择如下书籍,若是是初学,最好学周志明老师的深刻理解Java
虚拟机,虚拟机规范会直接劝退:oracle
Java SE 8版
)Java
规范只是标准,不一样的版本规范不同,同一个版本的规范在不一样的虚拟机上有不同的实现,初学者应该从最热门主流的HotSpot
虚拟机开始,也就是Oracle本身推出的Java虚拟机。框架
经过cmd
能够看出,我装的Java
环境使用的就是64位的HotSpot
虚拟机:
在了解JVM规范和原理的状况下,本身手动实现一个简易的Java虚拟机。对于大部分人来讲,挺难的,可是世间万物,为之则不难,不为,则难。一步登天则难,步步为营则不难。
语言排行版,目前Java是第二名:
https://www.tiobe.com/tiobe-index/
世界上没有最好的编程语言,须要按照具体的使用场景来讲话。
Java是一门跨平台语言,所谓跨平台就是,Java源文件会被编译成为字节码文件,不论是Windows,Linux仍是Mac,都有其适配的JVM,也就是字节码文件能够随意在这些JVM上去运行。
Write once,run anywhere.
其余的语言,例如c语言,编译成为机器码以后,因为底层的机器语言支持不同,编译后的机器语言文件是不能够跨操做系统运行的。而Java则是把兼容的工做,交给了JVM。不一样的JVM负责去适配不一样的操做系统。
全部的Java虚拟机都遵照java虚拟机的规范,语言编写者不须要考虑兼容问题。
Java虚拟机是Java平台的基石。 它是技术的组成部分,负责硬件和操做系统的独立性,已编译代码的小尺寸以及保护用户免受恶意程序攻击的能力。
Java虚拟机是抽象的计算机。 像真正的计算机同样,它具备指令集并在运行时操做各类内存区域。 使用虚拟机实现编程语言是至关广泛的。 最知名的虚拟机多是UCSD Pascal的P代码计算机。
JVM
是跨语言的平台,不少语言均可以编译成为遵照规范的字节码,这些字节码均可以在Java
虚拟机上运行。Java虚拟机不关心这个字节码是否是来自于Java程序,只须要各个语言提供本身的编译器,字节码遵循字节码规范,好比字节码的开头是CAFEBABY
。
将各类语言编译成为字节码文件的编译器,称之为前端编译器。而Java
虚拟机中,也有编译器,好比即时编译器,此处称为后端编译器。
Java
虚拟机要作到跨语言,目前来看应该是当下最强大的虚拟机。可是并不是一开始设计要跨语言。
跨语言的平台有利于什么?
因为有了跨语言平台,多语言混合编程就更加方便了,经过特定领域的语言去解决特定领域的问题。
好比并行处理使用Clojure
语言编写,展现层使用JRuby/Rails
,中间层用Java
编写,每一应用层均可以使用不一样的语言编写,接口对于开发者是透明的。不一样语言能够相互调用,就像是调用本身语言原生的API同样。它们都运行在同一个虚拟机上。
字节码狭义上是java
语言编译而成,可是因为JVM
是支持多种语言编译的字节码的,而字节码都是一个标准规范,由于咱们应该称其为JVM
字节码。
不一样的编译器,能够编译出相同的字节码文件,字节码文件也能够在不一样操做系统上的不一样JVM
中运行。
所以,Java
虚拟机实际上和Java
语言并不是强制关联的关系,虚拟机只和二级制文件(Class
文件)强关联。
【做者简介】:
秦怀,公众号【秦怀杂货店】做者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界但愿一切都很快,更快,可是我但愿本身能走好每一步,写好每一篇文章,期待和大家一块儿交流。