JVM概述

2023-11-11

1、什么是JVM
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
Java虚拟机本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。
Java语言的可移植性正是建立在Java虚拟机的基础上。任何平台只要装有针对于该平台的Java虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。

2、JDK、JRE和JVM关系

JDK = JRE + 开发工具(如编译器javac.exe)
JRE = JVM + 类库

Java程序的开发过程为:

    1、我们利用 JDK (调用 Java API)编写出 Java 源代码,存储于 .java 文件中
    2、JDK 中的编译器 javac 将 Java 源代码编译成 Java 字节码,存储于 .class 文件中
    3、JRE 加载、验证、执行 Java 字节码
    4、JVM 将字节码解析为机器码并映射到 CPU 指令集或 OS 的系统调用。

3、JVM的组成结构

JVM包含两个子系统和两个组件

两个子系统:

  • Class loader(类装载)
  • Execution engine(执行引擎)

两个组件:

  • Runtime data area(运行时数据区)
  • Native Interface(本地接口)

4、JVM运行时数据区

1、程序计数器(PC Register)

作用:记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器值则为空。

异常:此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

2、虚拟机栈(JVM Stacks)

作用:是Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧用于存储数据。每一个方法从调用直至执行完成,对应栈帧在虚拟机栈中入栈到出栈的过程。

异常:会抛出StackOverflowError和OutOfMemoryErrror异常。

栈帧(Stack Frame)包含以下几个部分

1、局部变量表:是存放方法参数和局部变量的区域

2、操作栈:是个初始状态为空的桶式结构栈。在方法执行过程中,会有各种指令往栈中写入和提取信息。JVM的执行引擎式基于栈的执行引擎,其中的栈指的就是操作栈。i++和++i(字节码指令)

3、动态链接:每个栈帧中包含一个在常量池中对当前方法的引用,目的是支持方法调用过程的动态连接

4、方法返回地址:方法执行有两种退出情况,正常退出和异常退出,两者都将返回至方法当前被调用的位置。方法退出的过程相当于弹出当前栈帧

3、本地方法栈(Native Method Stacks)

作用:与虚拟机栈所发挥的作用非常相似,为虚拟机使用到的Native方法服务。线程开始调用本地方法时,会进入不再受JVM约束的世界。本地方法可以通过 JNI(Java Native Interface)来访问虚拟机运行时的数据区。

异常:会抛出StackOverFlowError和OutOfMemoryError异常。

4、方法区(Method Area)

作用:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

异常:当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

垃圾回收:垃圾收集行为在这个区域时比较少出现的,其内存回收目标主要是对常量池的回收和对类型的卸载。JDK8之前,Hotspot中方法区的实现是永久代,JDK8开始使用元空间(Meta Space),以前永久代所有内容的字符串常量移至元空间,元空间直接在本地内存分配。

运行时常量池

1、是方法区的一部分

2、存放编译期生成的各种字面量和符号引用

3、Class文件中除了存有类的版本、字段、方法、接口等描述信息,还有一项是常量池,存有这个类的编译期生成的各种字面量和符合引用,这部分内容将在类加载后,存放到方法区的运行时常量池中

为什么废除1.7中永久代?

1、移除永久代是为融合Hotspot JVM与JR'ockit VM而做出的努力,因为JRockit没有永久代,不需要配置永久代

2、现实使用中,由于永久代内存经常不够用或发生内存泄露,爆出异常 java.lang.OutOfMemoryError: PermGen

3、基于此,将永久区废弃,而改用元空间,改为了使用本地内存空间
 

5、堆(Heap)

作用:Java虚拟机所管理的内存中最大的一块。Java堆是被线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

异常:如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

6、直接内存(Direct Memory)

直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是 Java 虚拟机规范中定义的内存区域。

在 JDK 1.4 中新加入了 NIO,引入了一种基于通道(Channel)与缓冲区(Buffer)的 I/O 方式,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在 Java 堆和 Native 堆中来回复制数据。

程序计数器、虚拟机栈、本地方法栈是线程私有的,方法区、堆是线程共享的

 

5、方法运行流程

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM概述 的相关文章

随机推荐

  • 0基础转行Python,应该具备的条件和注意的问题!新手必备

    很多想转行做Python的 只是看重了我们这行工资高 但是对于行业知识什么都不懂 行情也不懂 无头苍蝇似的 漫无目的去看些免费的死视频 但是有什么意义呢 接触互联网很多年 现在Python技术是越来越受到关注 如今转行做Python的非常多
  • Python绘图和数据可视化

    经过几个月的学习 总算是对Python这门语言有了一定的了解 据说Python语言使用流行度排名已经是第一了 Python之所以这么流行得益于它适用于很多不同领域 目前使用最广泛的领域包括有数据分析挖掘 网络爬虫 机器学习与人工智能 Pyt
  • visual studio:使用GIT的时候 “Could not open ***.VC.opendb”

    参考 https blog csdn net wk89665944 article details 51240011
  • No command 'setenv' found

    zz http blog csdn net qtyl1988 article details 8096097 今天又遇到一个能够充分证明自己是菜鸟的问题 我要在ubuntu12 04下编译安装OpenInventor 阅读OpenInven
  • 关于静态测试

    1 静态测试 静态测试是指不运行被测试程序而寻找程序代码中可能存在的错误或评估程序代码的过程 静态测试的特点是不需要运行代码 也不需要对代码编译 链接和生成可执行文件 它是通过分析或检查源程序的方法 结构 过程 接口等来检查程序的正确性 目
  • unbuntu22.04安装有道词典

    文章目录 ubuntu22 04安装有道词典的详细教程 一 下载正确的deb安装包 二 执行安装命令 三 如果安装失败 1 安装成功后无法打开 1 1 修改词典的源码1 1 2 修改词典的源码2 四 运行 ubuntu22 04安装有道词典
  • Javascript数组排序sort方法和自定义排序方法

    前言 针对一个数组进行排序 一个很常见的需求 尤其在后端 当然 前端也是有这个需求的 当然 数组排序 是有现成的方法的 就是sort 方法 我们先开看下这个 标准答案 sort方法 var arr 45 98 67 57 85 6 58 8
  • babel6.X、babel7.x、 babel8.x用法

    babel6 x使用方法 需要安装的包 npm install babel loader save npm install babel core save npm install babel preset es2015 save npm i
  • Jmeter2-手机验证码方式进行用户登录

    使用手机验证码实现登录 调用了两个接口 一是发送短信验证码 二是用户登录 思路 1 使用CSV Data Set Config参数化 2 获取时间戳 3 发送短信验证码 4 使用BeanShell取样器从redis缓存中获取短信验证码 5
  • Grafana与python后端通过get请求进行通信

    插件配置请参考 Grafana获取URL地址中的json数据 Grafana下载如下插件 文章目录 模拟URL路由 配置Grafana插件 效果展示 模拟URL路由 from fastapi import FastAPI Query imp
  • postman请求一个url,could not get any response

    postman请求一个url不通 浏览器可以访问通 preface 现象 排除问题 总结 preface 最近 同事使用 postman 遇到一个问题 url 请求不通 could not get any response 现象 排除问题
  • 使用 Iceberg on Kubernetes 打造新一代云原生数据湖

    背景 大数据发展至今 按照 Google 2003年发布的 The Google File System 第一篇论文算起 已走过17个年头 可惜的是 Google 当时并没有开源其技术 仅仅 是发表了三篇技术论文 所以回头看 只能算是揭开了
  • STM32速成笔记—ADC

    文章目录 一 什么是ADC 二 ADC的用途 三 STM32F103ZET6的ADC 3 1 ADC通道对应引脚 3 2ADC时钟 3 3 ADC工作模式 3 4 ADC转换时间 3 5 ADC校准 3 6 ADC转换结果与实际电压的换算
  • js中的对象和函数的彻底理解

    在js中对象就是神一般的存在 什么都是对象 包括函数 你就这么理解好了 函数是用来实现具体功能的代码 用一种方式把他们组织起来 就是函数了 对象是有属性和方法的一个东西 在对象中的函数就变成了方法 刚学习js不用太纠结这些概念性的东西吧 慢
  • Python学习第十六天——数据库基础与MySQL基础操作

    数据库分类 1 关系型数据库 有固定的表结构 并且表与表之间可以建立关系 常见数据库 MySQL PostgreSQL Oracle db2 sqlite sqlserver access mariadb 2 非关系型数据库 没有固定的表结
  • EMWIN密码验证窗口创建

    EMWIN密码验证窗口创建 调用接口 file PasswdCheck c date 2020 7 6 author aron566 copyright None brief 通用密码验证页面 details None version V1
  • 买不到的数目 遍历法和公式推导法(第四届蓝桥杯省赛C++A组,第四届蓝桥杯省赛JAVAC组)

    突然决定要参加蓝桥 已经超级久没复习C C 的我考前还是决定打几道题捡一捡C C 的语法和思路 2023年蓝桥的题之后会出 因为 AcWing上还没有出可以测试的程序 也没把握说自己考场上做的就是对的 目录 题目 思路 代码 题目 小明开了
  • 华为od机试题5 真题

    华为od机试题 真题 45 满足规则的数组组合 44 最长连续子序列的和等于输入值 43 整数编码 42 输出指定格式字符 40 小朋友分班 39 数列解析 38 url拼接 36 满足最低能力值的数量 以下题目附带Java解法 是我个人写
  • shell中的求幂

    小白今天突然想用shell来求一下2的32次幂 一时竟想不出求解办法 上网搜了一下 操作之后 发现很简单 如下 oracle linux101 gt echo 2 32 bc l 由此可得 bc并不支持幂的求法 standard in 1
  • JVM概述

    1 什么是JVM JVM是Java Virtual Machine Java虚拟机 的缩写 JVM是一种用于计算设备的规范 它是一个虚构出来的计算机 是通过在实际的计算机上仿真模拟各种计算机功能来实现的 引入Java语言虚拟机后 Java语