5

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

 3 years ago
source link: http://www.cnblogs.com/Damaer/p/14349595.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

学习JVM的重要性

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

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

YNrQBvn.png!mobile

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

  • 运行系统卡死,系统无法访问,直接 OOM
  • 线上 GC (垃圾回收)有问题,需要 dump 内存,进行分析。
  • 新项目上线,需要对系统进行评估,设置 JVM 的参数。
  • 面试时被问及实际项目中 JVM 参数调优。

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

jUfUv2n.png!mobile

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

如何学习JVM

去官网找虚拟机规范(英文版):

https://www.oracle.com/cn/java/technologies/javase-downloads.html

yQFvuyI.png!mobile

找到: Java Language and Virtual Machine Specifications :

qU3INjv.png!mobile

打开之后是: https://docs.oracle.com/javase/specs/index.html ,也就是Java语言和虚拟机的规范。

RRzmmyV.png!mobile

可以选择以下书籍,如果是初学,最好学周志明老师的深入理解 Java 虚拟机,虚拟机规范会直接劝退:

Java SE 8版

Ufm6Rjb.png!mobile

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

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

eyE73ay.png!mobile

如何真正搞懂JVM?

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

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

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

VJjAFnj.png!mobile

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

Java跨平台怎么理解?

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

Write once,run anywhere.

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

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

nu2QZjr.png!mobile

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

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

JVM 跨语言怎么理解?

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

qUVf2yb.png!mobile

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

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

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

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

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

何为字节码?

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

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

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

【作者简介】:

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK