学习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文件)强关联。

【作者简介】

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

JVM笔记 -- Java跨平台和JVM跨语言的更多相关文章

  1. JVM笔记-Java技术体系与JVM概述

    1. 简述 Java 不仅仅是一门编程语言,还是一个由一系列计算机软件和规范组成的技术体系. Java 的广告词为 "一次编写,到处运行",之所以能够做到"跨平台&quo ...

  2. JVM笔记(二)JVM基本结构

    JVM基本结构 一.运行时内存区域 java虚拟机所管理的内存将会包括以下几个运行时内存区域. 1.程序计数器 Program Counter Register:可以看作当前线程(线程私有)所执行的字 ...

  3. JVM上篇:JVM与Java体系结构

    JVM笔记 JVM传言 Java不是最强大的语言,但是JVM是最强大的虚拟机 虚拟机分类 系统虚拟机 类似VMware,就属于系统虚拟机,它提供了一个可运行完整操作系统的平台 程序虚拟机 Java虚拟 ...

  4. JVM笔记(虚拟机各内存的介绍)

    JVM笔记 java代码执行分为两部分:javac编译     java执行 代码并不是由上往下执行的,会经过编译期重排序进行优化,存在依赖关系的代码不会被重排序,保证了代码最终执行结果的正确性! j ...

  5. Java学习之JVM、JRE、JDK联系与区别

    JVM,全称是Java Virtual Machine,翻译为Java虚拟机: JRE,全称是Java Runtime Environment,翻译为Java运行时环境: JDK,全称是Java De ...

  6. 01-常见Dos命令、Java历史、Java跨平台、配置Path环境变量、第一个HelloWorld例子

    常见Dos命令 dir: 列出当前目录下的文件以及文件夹 md: 创建目录 rd: 删除目录 cd: 进入指定目录 del: 删除文件 copy: 复制文件 xcopy: 复制目录 tree: 列出目 ...

  7. Java跨平台原理与Java虚拟机(JVM)

    Java跨平台原理(字节码文件.虚拟机) C/C++语言都直接编译成针对特定平台机器码.如果要跨平台,需要使用相应的编译器重新编译. Java源程序(.java)要先编译成与平台无关的字节码文件(.c ...

  8. Java跨平台的原理--java跨平台是通过JVM实现的

    孙鑫视频---笔记(1-3) java跨平台是通过JVM(java 虚拟机)实现的. Java应用程序的开发周期: 编译.下载.解释.执行. 1.java源文件的编译过程 java编译程序将java源 ...

  9. Java基础技术JVM面试【笔记】

    Java基础技术JVM面试[笔记] JVM JVM 对 java 类的使用总体上可以分为两部分:一是把静态的 class 文件加载到 JVM 内存,二是在 JVM 内存中进行 Java 类的生命周期管 ...

随机推荐

  1. Fresco 二三事:图片处理之旋转、缩放、裁剪切割图片

    关于Fresco加载图片的处理,例如旋转.裁剪切割图片,在官方文档也都有提到,只是感觉写的不太详细,正好最近项目里有类似需求,所以分享一些使用小tip,后面的朋友就不用再走弯路浪费时间了.(测试图片分 ...

  2. 这4种ThreadLocal你都知道吗?

    什么是ThreadLocal ThreadLocal类顾名思义可以理解为线程本地变量.也就是说如果定义了一个ThreadLocal, 每个线程往这个ThreadLocal中读写是线程隔离,互相之间不会 ...

  3. spring的ioc容器生成的对象也是代理对象对吗

    一直以为spring的ioc容器生成的对象都是代理对象,其实这个是错误的.spring ioc默认的都是原生对象  只有通过aop增强的对象才是代理对象 有@Transactional  注解或者配置 ...

  4. [leetcode]200. Number of Islands岛屿数量

    dfs的第一题 被边界和0包围的1才是岛屿,问题就是分理出连续的1 思路是遍历数组数岛屿,dfs四个方向,遇到1后把周围连续的1置零,代表一个岛屿. /* 思路是:遍历二维数组,遇到1就把周围连续的1 ...

  5. leetcode网站中找到的关于trie树的JAVA版本介绍

    class TrieNode { // R links to node children private TrieNode[] links; private final int R = 26; pri ...

  6. 【Java基础】基本语法-程序流程控制

    基本语法-程序流程控制 程序流程控制 流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块. 其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即: 顺 ...

  7. Nginx基础知识学习(安装/进程模型/事件处理机制/详细配置/定时切割日志)

    一.Linux下Nginx的安装 1.去官网 http://nginx.org/download/下载对应的Nginx安装包,推荐使用稳定版本. 2.上传Nginx到Linux服务器. 3.安装依赖环 ...

  8. 【Linux】centos7中 root家目录中perl5文件夹无法删除问题解决

    由于新项目上线,安装了一些perl的一些包 但是发现,在/root下有一个perl5/的文件夹,删除后,重新登录又会出现,很是烦人,而且他还没有内容,就是一个空文件 那么着手搞掉他 环境:centos ...

  9. 【Oracle】删除(释放)数据文件/表空间流程

    oracle删除(释放)数据文件/表空间流程 生产环境:数据库里空间不足,niptest 表空间251G,只使用了17G 再alter database datafile '...../niptest ...

  10. Java调用Linux命令执行

    调用方式 Java调用linux命令执行的方式有两种,一种是直接调用linux命令,一种是将linux命令写到.sh脚本中,然后调用脚本执行. 详细说明 直接调用:使用java中lang包下面的Run ...