JVM学习笔记 01 - JVM是啥?JDK是啥?JRE是啥
创始人
2025-05-29 02:46:54
0

JVM、JDK和JRE

JVM全称 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机。它能识别 .class后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。

JDK全称 Java Development Kit,是 Java 开发的核心,让不了解机器代码和二进制文件的人,能够通过工具去编程,实现应用功能。

JRE全称Java Runtime Environment, Java 的运行时环境。JVM 标准加上实现的一大堆基础类库,比如:怎么操作文件、怎么连接网络等,会一次性将 JVM 运行所需的类库都传递给它。

        一般情况下,使用 C++ 开发的程序,编译成二进制文件后,就可以直接执行了,操作系统能够识别它;但是 Java 程序不一样,使用 javac 编译成 .class 文件之后,还需要使用 Java 命令去主动执行它,因为操作系统并不认识这些 .class 文件。以下是JVM的位置示意图:

Java 虚拟机规范和 Java 语言规范的关系 

        左半部分是 Java 虚拟机规范,其实就是为输入和执行字节码提供一个运行环境。右半部分是我们常说的 Java 语法规范,比如 switch、for、泛型、lambda 等相关的程序,最终都会编译成字节码。而连接左右两部分的桥梁依然是 Java 的字节码。
        如果 .class 文件的规格是不变的,这两部分是可以独立进行优化的。但 Java 也会偶尔扩充一下 .class 文件的格式,增加一些字节码指令,以便支持更多的特性。
        我们可以把 Java 虚拟机可以看作是一台抽象的计算机,它有自己的指令集以及各种运行时内存区域,学过《计算机组成结构》的同学会在课程的后面看到非常多的相似性。
        你可能会有疑问,如果我不学习 JVM,会影响我写 Java 代码么?理论上,这两者没有什么必然的联系。它们之间通过 .class 文件进行交互,即使你不了解 JVM,也能够写大多数的 Java 代码。就像是你写 C++ 代码一样,并不需要特别深入的了解操作系统的底层是如何实现的。
        但是,如果你想要写一些比较精巧、效率比较高的代码,就需要了解一些执行层面的知识了。了解 JVM,主要用在调优以及故障排查上面,你会对运行中的各种资源分配,有一个比较全面的掌控。

        我们所说的 JVM,狭义上指的就 HotSpot。如非特殊说明,我们都以 HotSpot 为准。

JVM 内存布局

JVM 内存区域划分如图所示,从图中我们可以看出:

  • JVM 堆中的数据是共享的,是占用内存最大的一块区域。
  • 可以执行字节码的模块叫作执行引擎。
  • 执行引擎在线程切换时怎么恢复?依靠的就是程序计数器。
  • JVM 的内存划分与多线程是息息相关的。像我们程序中运行时用到的栈,以及本地方法栈,它们的维度都是线程。
  • 本地内存包含元数据区和一些直接内存。

为什么 Java 研发系统需要 JVM?

JVM 解释的是类似于汇编语言的字节码,需要一个抽象的运行时环境。同时,这个虚拟环境也需要解决字节码加载、自动垃圾回收、并发等一系列问题。JVM 其实是一个规范,定义了 .class 文件的结构、加载机制、数据存储、运行时栈等诸多内容,最常用的 JVM 实现就是 Hotspot。

JVM 的生命周期是和 Java 程序的运行一样的,当程序运行结束,JVM 实例也跟着消失了。

一个 Java 程序,首先经过 javac 编译成 .class 文件,然后 JVM 将其加载到元数据区,执行引擎将会通过混合模式执行这些字节码。执行时,会翻译成操作系统相关的函数。JVM 作为 .class 文件的黑盒存在,输入字节码,调用操作系统函数。
过程如下:Java 文件->编译器>字节码->JVM->机器码。

整理自: 

第01讲:一探究竟:为什么需要 JVM?它处在什么位置?

第02讲:大厂面试题:你不得不掌握的 JVM 内存管理

相关内容

热门资讯

【Vue3 基础篇】04.响应... 计算属性 computed Vue 提供的一种,用来描述复杂逻辑的响应式状态的 API:计算属性 A...
vue $get和$set方法 vue $get 和 $set 方法 $set方法 $set 方法用于添加响应式对象的属性ÿ...
《微机原理与接口技术》期末考试... 内容还会更新 微机原理只有理解了为什么,才可以真正记住这些代码怎么写,知...
【高阶数据结构】布隆过滤器和分... 文章目录1. 前置知识① 散列表② Hash函数③ 为什么要选择Hash④ 负载因子⑤ 解决哈希冲突...
css 背景渐变 序:本来用圆锥渐变画一个色盘的,后来想想要不要把背景渐变也总结一下&#x...
React 执行架构流程详细-... React 执行架构流程详细----归阶段 mount 时流程(三) 目...
mac删除文件夹它又自动恢复 ... 我们在使用电脑的过程中,需要不断地去清理电脑中不用或废弃的文件,从而保证...
Go Wails Docker... 文章目录1.背景2. 技术选型2.1 Wails2.2 Go2.3 Ant Design Vue3....
关于Anaconda安装后Sp... tensorflow1.14.0安装教程--保姆级_安装tensorflow1.14_星河欲转。的博...
(18)C#传智:HTML,属... 比较简单,无事的跳过,直接w3c.school 一、HTML简介  ...
ORBSLAM3 --- 地图... 目录 1.函数作用 2.函数流程 3.代码注释 4.代码解析 4.1 中止全局BA线程、局部建图线...
【MapGIS精品教程】012... 文章目录 一、DEM概述二、DEM建立1. 创建规则格网Grid2. 创建不规则三角网Tin 三、数...
Spring OpenFeig... 在前文,我们了解到feign实现负载均衡需要两个重要的接口: ILoad...
汽车电子的搬运工(AUTOSA... AUTOSAR开发技术手册 一、总体概述 AUTOSAR是Automotive Open Syste...
Selfish (Space ... Getting Started: Selfish (Space Edition) version 1...
idea中使用maven进行多... 引言 模块关系: A:代表父工程B:代表WEB模块&#x...
一篇博客教会你怎么使用Dock... 文章目录启动 Docker创建 Nginx 容器配置 Nginx 首先我们需要安装Docker&#...
STM32F407/ hk32... STM32F407/ hk32f030m 系统性能测试–dhrystone 一.MCU 基本情况 C...
BC95 低功耗的NB-IoT... BC95 是一款高性能、低功耗的NB-IoT 无线通信模块。其尺寸仅为19.9 × 23.6 × 2...
【入门4 数组】P5729 【... 【深基5.例7】工艺品制作 题目描述 现有一个长宽高分别为 w,x,hw,x,hw,x,h 组成的实...