JVM和操作系统的关系是什么?
本章内容概要:
文章目录
各位亲们,请原谅我开启了仅粉丝可见,并不是为了赚粉丝,是因为一些可恶的网站大批量的爬我们这些原创博主的文章。开启了仅粉丝可见后他们就无法进行爬取后面的内容,也麻烦大家点个小小的关注才能看到后面的内容,当然了内容不好,看完也可以取消关注哈,嘿嘿。
JVM和操作系统的关系?
1、现实举例
在现实生活中,你想要娶媳妇就得有车有房,想有车有房的话,你还必须要有钱才可以。
想有钱,就必须要有趁手的工具去能够让你赚钱。
2、认真了解JVM是个什么家伙
JVM全称(Java Virtual Machine),就是我们很耳熟的Java虚拟机。它能够识别.class后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。
如果你熟悉C++的话,使用C++开发的程序,一般情况下编译成二进制后,就可以直接执行了,操作系统能够识别它,因为C++和C是编译成汇编语言的,离操作系统非常进。
而Java程序就不一样了,使用javac编译成.class文件之后,还需要使用Java命令去主动执行它,操作系统并不认识这些.class文件。
你可能会觉得Java这么麻烦,还不如C++呢,一步到位多好呀。
可这恰恰就是JVM的过人之处。如果你经常接触Java,可能知道,Java是一门抽象程度非常高的语言,提供了自动内存管理等一系列的特性。这些特性直接在操作系统上实现是不太可能的,所以就需要JVM进行完成。
而C++和C语言就需要去手动的释放内存。
通过上面的介绍,我们了解到:
- JVM:等同于操作系统;
- Java字节码:等同于汇编语言。
可以把JVM认为是一个翻译器,从开始运行的时候就会持续不断的翻译执行Java字节码,然后调用真正的操作系统函数,这些操作系统函数是与平台息息相关的。
如下图所示:
从上图可以看到,有了JVM虚拟机之后,就可以实现跨平台。
不同的操作系统上安装上功能一样的Java环境,JVM只需要保证能够正确执行.class文件,JVM负责翻译.class文件,从而调用不同操作系统上的函数,最终完成特定的功能。
而Java跨平台的意义在于一次编译,处处运行,能够做到这一点JVM功不可没。
例如我们熟悉的Maven和其他一些管理jar包工具,发布者只需要关心如何拿到jar包,无需拿到后重新编译就可以执行。
jar包中则是编译之后的.class文件,如果有兴趣可以解压出来看看。
可以用一句话来概括JVM和操作系统之间的关系:
JVM就是承上启下的作用,上承开发语言,下接操作系统,它的中间接口就是字节码
。
3、对比Java程序与C++程序执行的流程
Java程序与C++程序执行的流程:
(1)C++程序的执行流程
(2)Java程序的执行流程
对比这两张图可以看出C++程序是编译成操作系统能够直接
识别的.exe文件;
而Java程序是编译成JVM能够识别的.class文件
,然后由JVM负责调用系统函数执行程序
。
- Leetcode-Easy 155. Min Stack
- Leetcode-Easy 72. Edit Distance
- React第三方组件4(状态管理之Reflux的使用③TodoList中)
- Leetcode-Easy21. Merge Two Sorted ListsDefinition for singly-linked list.class ListNode:def init(sel
- Burp Suite详细使用教程-Intruder模块详解
- 逆元的三种解法(附详细证明)
- JavaScript设计模式与开发实践 - 单例模式
- Leetcode-Easy 141. Linked List Cycle
- 【DataMagic】如何在万亿级别规模的数据量上使用Spark
- 51nod1004 n^n的末位数字
- Leetcode-Easy 20. Valid Parentheses
- Leetcode-Easy 234. Palindrome Linked List
- 为什么是link-visited-hover-active
- 51Nod 1051 最大子矩阵和
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Docker ENTRYPOINT 笔记
- R语言入门之数据类型
- R语言入门之工作空间与R包
- 如何判断环境变量为空
- Spark 面试题系列-1
- Spark 面试题系列-2
- tf-operator 的测试
- Kubeflow 部署采坑记录
- Kubeflow v0.6.0 部署采坑记录
- Kubeflow Pipeline 部署记录
- Kubeflow Pipeline - 上传一个 Pipeline
- Kubeflow Pipeline - 构建自定义的 Workflow
- R语言入门之变量重编码与重命名
- Kubeflow Pipeline - 构建一个机器学习 Workflow
- Git 如何压缩 commit