写点什么

JVM 笔记 -- Java 跨平台和 JVM 跨语言

发布于: 2021 年 01 月 30 日

学习 JVM 的重要性


从上层应用程序到底层操作系统,到底有哪些东西?


平时开发的应用程序主要基于各种框架,譬如Spring,SpringMVC,Mybatis,而各种框架又是基于Java API来实现的,Java API调用执行是在JVM上的,而JVM则是运行在操作系统上的,操作系统是在物理机器打交道的。



在框架上进行业务开发,或者学习框架如何使用,是大部分开发者的工作。但是实际上我们不该执着于框架该如何使用,而是应该往下走,一般最后遇到的问题都会到JVM和操作系统的问题。即使现在的 JVM 已经很完善,帮开发者做了很多事,但是我们不该以此为理由不去了解 JVM 的原理。架构师把开发者变成温室里的花朵和温水里的青蛙,如果有一天出现以下问题,该怎么解决:


  • 运行系统卡死,系统无法访问,直接 OOM

  • 线上 GC (垃圾回收)有问题,需要 dump 内存,进行分析。

  • 新项目上线,需要对系统进行评估,设置 JVM 的参数。

  • 面试时被问及实际项目中 JVM 参数调优。


几乎所有的高级语言在交给机器 CPU 执行之前,都会经历 高级语言 --> 汇编语言 --> 机器指令 的过程,因为计算机是不会直接识别高级语言的。了解高级语言如何转换成能被机器识别的语言,是开发者必须掌握的技能。



JavaC++多了动态内存分配以及垃圾回收技术,Java的虚拟机帮开发者做了垃圾收集,编译优化等一系列工作,里面的垃圾收集算法有哪些?怎么执行的?JIT编译器是怎么工作的?这些往往也是面试常谈的话题。懂得JVM的内部机构和工作机制,有利于设计高拓展的应用和快速诊断运行时的问题。


如何学习 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虚拟机,虚拟机规范会直接劝退:

  • Java 虚拟机规范(Java SE 8版

  • 深入理解 Java 虚拟机(JVM 高级特性与最佳实践)



Java规范只是标准,不同的版本规范不一样,同一个版本的规范在不同的虚拟机上有不一样的实现,初学者应该从最热门主流的HotSpot虚拟机开始,也就是 Oracle 自己推出的 Java 虚拟机。


通过cmd可以看出,我装的Java环境使用的就是 64 位的HotSpot虚拟机:


如何真正搞懂 JVM?


在了解 JVM 规范和原理的情况下,自己手动实现一个简易的 Java 虚拟机。对于大部分人来说,挺难的,但是世间万物,为之则不难,不为,则难。一步登天则难,步步为营则不难。


语言排行版,目前 Java 是第二名:

https://www.tiobe.com/tiobe-index/



世界上没有最好的编程语言,需要按照具体的使用场景来说话。


Java 跨平台怎么理解?

Java 是一门跨平台语言,所谓跨平台就是,Java 源文件会被编译成为字节码文件,不管是 Windows,Linux 还是 Mac,都有其适配的 JVM,也就是字节码文件可以随意在这些 JVM 上去运行。


Write once,run anywhere.


其他的语言,例如 c 语言,编译成为机器码之后,由于底层的机器语言支持不一样,编译后的机器语言文件是不可以跨操作系统运行的。而 Java 则是把兼容的工作,交给了 JVM。不同的 JVM 负责去适配不同的操作系统。


所有的 Java 虚拟机都遵守 java 虚拟机的规范,语言编写者不需要考虑兼容问题。



Java 虚拟机是 Java 平台的基石。 它是技术的组成部分,负责硬件和操作系统的独立性,已编译代码的小尺寸以及保护用户免受恶意程序攻击的能力。

Java 虚拟机是抽象的计算机。 像真正的计算机一样,它具有指令集并在运行时操作各种内存区域。 使用虚拟机实现编程语言是相当普遍的。 最知名的虚拟机可能是 UCSD Pascal 的 P 代码计算机。


JVM 跨语言怎么理解?


JVM是跨语言的平台,很多语言都可以编译成为遵守规范的字节码,这些字节码都可以在Java虚拟机上运行。Java 虚拟机不关心这个字节码是不是来自于 Java 程序,只需要各个语言提供自己的编译器,字节码遵循字节码规范,比如字节码的开头是CAFEBABY



将各种语言编译成为字节码文件的编译器,称之为前端编译器。而Java虚拟机中,也有编译器,比如即时编译器,此处称为后端编译器。


Java虚拟机要做到跨语言,目前来看应该是当下最强大的虚拟机。但是并非一开始设计要跨语言。


跨语言的平台有利于什么?

由于有了跨语言平台,多语言混合编程就更加方便了,通过特定领域的语言去解决特定领域的问题。


比如并行处理使用Clojure语言编写,展示层使用JRuby/Rails,中间层用Java编写,每一应用层都可以使用不同的语言编写,接口对于开发者是透明的。不同语言可以相互调用,就像是调用自己语言原生的 API 一样。它们都运行在同一个虚拟机上。


何为字节码?

字节码狭义上是java语言编译而成,但是由于JVM是支持多种语言编译的字节码的,而字节码都是一个标准规范,因为我们应该称其为JVM字节码。


不同的编译器,可以编译出相同的字节码文件,字节码文件也可以在不同操作系统上的不同JVM中运行。


因此,Java虚拟机实际上和Java语言并非强制关联的关系,虚拟机只和二级制文件(Class文件)强关联。


【作者简介】

秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界希望一切都很快,更快,但是我希望自己能走好每一步,写好每一篇文章,期待和你们一起交流。


发布于: 2021 年 01 月 30 日阅读数: 19
用户头像

纵使缓慢,驰而不息。 2018.05.17 加入

慢慢走,比较快。公众号:秦怀杂货店

评论

发布
暂无评论
JVM笔记 -- Java跨平台和JVM跨语言