【JVM】JVM执行流程和内存区域划分
文章目录
- 是什么
- JVM 执行流程
- 内存区域划分
- 堆
- 栈
- 程序计数器
- 元数据区
- 经典笔试题
是什么
Java 虚拟机
- JDK,Java 开发工具包
- JRE,Java 运行时环境
- JVM,Java 虚拟机
JVM 就是 Java 虚拟机,解释执行 Java 字节码
JVM 执行流程
编程语言可以分为:
- 编译型语言:先将高级语言转换成二进制的机器指令,再由 CPU 去直接执行
- 解释型语言:一边去转换,一边去执行
这样的说法放单今天,硬件不适用了
按照上述这种经典的划分方式,可以认为 Java 属于“半编译,半解释”。Java 这么设定,最主要的目的就是为了“跨平台”。
- 像 C++这样的语言是直接编译成了二进制的机器指令,而不同的
CPU支持的指令不一样,而且生成的可执行程序,在不同的系统上也有不同的格式Windows可执行程序:PE格式Linux可执行程序:ELF格式
当前看到的手机操作系统,为什么只有安卓、iOS?
- 因为搞一个新的系统,现有的软件不能兼容,没有生态也就没有市场
- 鸿蒙能直接运行安卓程序,是因为鸿蒙不是新系统,只是安卓套壳
Java 不想重新编译,而是期望能够直接执行
- 先通过
javac把.java文件==>.class文件(字节码文件,包含的就是Java字节码,Java自己搞的一套CPU指令)- 因为如果生成
CPU直接能执行的指令的话,不同的CPU支持的指令就不一样,就不能在所有系统上执行
- 因为如果生成
- 这样先把
java代码转成对应的java字节码文件,然后在某个具体的系统平台上执行,此时通过JVM把上述的字节码转换成对应的CPU能识别的机器指令(JVM就是一个翻译官的角色)
通过上述转换,我们就可以不去重新编译,也能够完成良好的跨平台。因此,我们编写和发布一个 java 程序,其实就只要发布 .class 文件就可以了,JVM 拿到 .class 文件之后,就知道如何转换
Windows上的JVM就可以把.class转换成Windows上能支持的可执行指令了Linux上的JVM就可以把.class转换成 Linux 上可以支持的可执行指令了
不同平台的局面是存在差异的,而不是同一个。对上(给java层面上提供的内容)是统一一致的
内存区域划分
JVM 其实也是一个进程(任务管理器中看到的 java 进程)
进程运行过程中,要从操作系统这里车身轻一些资源(内存就是其中的典型资源),这些内存空间就支撑了后续 java 程序的执行。
- 比如,在
java中定义变量(就会申请内存),内存其实就是JVM从系统这边申请到的内存,然后再交给具体的java程序去使用
JVM 从系统申请了一大块内存,这一大块内存给 java 程序使用的时候,又会根据实际的使用用途,来划分出不同的空间,这就是所谓的“区域划分”
堆
代码中 new 出来的对象,都是在堆里。对象中持有的非静态成员变量,也都在堆里。只有一份
- 静态成员变量在元数据区
栈
本地方法栈/虚拟机栈。包含了方法调用关系和局部变量
- 在代码执行过程中,肯定会涉及到很多方法的调用,调用的关系就通过栈空间记录下来
- 虚拟机栈,记录了
Java代码的调用关系,Java代码的局部变量 - 本地方法栈,记录了
JVM内部,通过C++写的代码的调用关系和局部变量
一般不会关注本地方法栈,一般来说谈到栈,就默认指的是“虚拟机栈”
这里谈到的“堆“和“栈“,和数据结构中的“堆“和“栈“是不同的。这里的是两块区域
程序计数器
这个区域比较小,专门用来存储下一条要执行的 Java 指令的地址
元数据区
“元数据”是计算机中的一个常见术语(meta data),往往指的是一些辅助性质的,描述性质的属性。只有一份
比如:硬盘上不仅仅要存储数据本体,还要存储一些辅助信息:文件的大小、文件的位置、文件的拥有者、文件的修改时间、文件的权限信息… 这些辅助信息统称为“元数据”
在以前的 Java 版本中,也叫做“方法区”,从 1.8 开始改的名字
云数据区中主要保存:
- 类的信息
- 方法的信息
一个程序,有哪些类、每个类里都有哪些方法、每个方法里面都要包含哪些指令,都会记录在元数据区。
我们写的 Java 代码,if、while、for 等各种逻辑运算,这些操作都会被转换成 Java 字节码
javac就会完成上述代码到字节码的转换- 此时这些字节码在程序运行的时候就会被
JVM加载到内存中,放到元数据区(方法区)里面 - 之后,当前程序要如何执行,要做哪些事情,就会按照上述元数据区里面记录的字节码一次执行了
我们所编写的代码,都会被转换成二进制指令,都会进入到内存中,然后才能执行。
类似于剧本杀
- 剧本杀里面给美格玩家发一个剧本,每个玩家就按照剧本上给出的要求来演
- 此处所谓 Java 字节码,要执行的方法的细节,就像剧本一样,需要把剧本加载到内存中,然后才能执行
堆和元数据区只有一份(所有线程共享一份),栈和程序计数器可能有 n 份(和线程相关,每个线程都有自己的程序计数器和栈(每个线程有自己的执行流))
经典笔试题
在下面代码中,t、n、m 分别处于 JVM 内存中的哪个区域?
class Test() {private int n;private static int m;
}main() {Test t = new Text();
}
t是一个局部变量(引用类型),在栈上n是Test的成员变量,new出来的Test是在堆上的,所以n作为成员变量也是处于堆上static修饰的变量,称为“类属性”;static修饰的方法,称为“类方法”- 非
static修饰的变量,称为“实例属性”;非static修饰的方法,称为“实例方法” - 所以这里的
m是长在类上的成员,和new不new实例没有关系。上述带有static修饰的变量,就是在类对象中,也就是在元数据区中(方法区)
类对象,
Test.class
JVM把.class文件加载到内存之后,就会把这里的信息使用对象来表示,此时这样的对象就是类对象- 类对象里就包含了一系列的信息,包括但不限于:
- 类的名称
- 类继承自那个类
- 实现了哪些接口
- 都有哪些成员,都叫什么,都是什么类型,都是什么权限
- 都有哪些方法,都叫什么,都是什么参数,都是什么权限
.java文件中涉及到的信息都会在.class中有所体现(注释是不会包含的)
区分一个变量在哪个内存区域中,最主要的就是看变量的形态
- 局部变量
- 成员变量
- 静态成员变量
- …
相关文章:
【JVM】JVM执行流程和内存区域划分
文章目录 是什么JVM 执行流程内存区域划分堆栈程序计数器元数据区经典笔试题 是什么 Java 虚拟机 JDK,Java 开发工具包JRE,Java 运行时环境JVM,Java 虚拟机 JVM 就是 Java 虚拟机,解释执行 Java 字节码 JVM 执行流程 编程语言…...
Python | 读取.dat 文件
写在前面 使用matlab可以输出为 .dat 或者 .mat 形式的文件,之前介绍过读取 .mat 后缀文件,今天正好把 .dat 的读取也记录一下。 读取方法 这里可以使用pandas库将其作为一个dataframe的形式读取进python,数据内容格式如下,根据…...
信息技术的变革与未来发展的思考
信息技术的变革与未来发展的思考 在21世纪,信息技术(IT)正在以前所未有的速度推动社会、经济、文化的深刻变革。无论是人工智能、大数据,还是云计算、物联网,信息技术的发展已经渗透到了各个行业,彻底改变…...
融会贯通记单词,绝对丝滑,一天轻松记几百
如果我将flower(花)、flat(公寓)、floor(地板)、plane(飞机)几个单词放在一起,你会怎么来记忆这样的一些单词呢? 我们会发现,我们首先可以将plane去掉,因为它看上去几乎就是一个异类。这样,我们首先就可以将…...
【计算机视觉】YoloV8-训练与测试教程
✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛) 🌈 个人Motto:他强任他强,清风拂山冈! 💫 欢迎来到我的学习笔记! 制作数据集 Labelme 数据集 数据集选用自己标注的,可参考以下:…...
响应式布局-媒体查询父级布局容器
1.响应式布局容器 父局作为布局容器,配合自己元素实现变化效果,原理:在不通过屏幕下面吗,通过媒体查询来改变子元素的排列方式和大小,从而实现不同尺寸屏幕下看到不同的效果。 2.响应尺寸布局容器常见宽度划分 手机-…...
Android APN type 配置和问题
问题/疑问 如果APN配置了非法类型(代码没有定义的),则APN匹配加载的时候最终结果会是空类型。 那么到底是xml解析到数据库就是空type呢?还是Java代码匹配的时候映射是空的呢? Debug Log 尝试将原本的APN type加入ota或者新建一条ota type APN,检查log情况。 //Type有…...
前端mock了所有……
目录 一、背景描述 二、开发流程 1.引入Mock 2.创建文件 3.需求描述 4.Mock实现 三、总结 一、背景描述 前提: 事情是这样的,老板想要我们写一个demo拿去路演/拉项目,有一些数据,希望前端接一下,写几个表格&a…...
fiddler抓包10_列表显示请求方法
① 请求列表表头,鼠标悬停点击右键弹出选项菜单。 ② 点击“Customize columns”(定制列)。 ③ 弹窗中,“Collection”下拉列表选择“Miscellaneous”(更多字段)。 ④ “Field Name”选择“RequestMethod”…...
Win10系统复制、粘贴、新建、删除文件或文件夹后需要手动刷新的解决办法
有些win10系统可能会出现新建、粘贴、删除文件或文件夹后保持原来的状态不变,需要手动刷新,我这边新装的几个系统都有这个问题,已经困扰很久了,我从微软论坛和CSDN社区找了了很多方法都没解决,微软工程师给的建议包括重…...
BERT训练环节(代码实现)
1.代码实现 #导包 import torch from torch import nn import dltools #加载数据需要用到的声明变量 batch_size, max_len 1, 64 #获取训练数据迭代器、词汇表 train_iter, vocab dltools.load_data_wiki(batch_size, max_len) #其余都是二维数组 #tokens, segments, vali…...
必须执行该语句才能获得结果
UncategorizedSQLException: Error getting generated key or setting result to parameter object. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 必须执行该语句才能获得结果。 ; uncategorized SQLException; SQL state [null]; error code [0]; 必须执行该语句…...
AI论文写作可靠吗?分享5款论文写作助手ai免费网站
AI论文写作的可靠性是一个备受关注的话题。在当前的技术背景下,AI写作工具能够显著提高论文写作的效率和质量,但其可靠性和安全性仍需谨慎评估。 AI论文写作的可靠性 技术能力与限制 AI论文写作的质量很大程度上取决于用户提供的输入指令或素材的质量…...
AJAX 入门 day3 XMLHttpRequest、Promise对象、自己封装简单版的axios
目录 1.XMLHttpRequest 1.1 XMLHttpRequest认识 1.2 用ajax发送请求 1.3 案例 1.4 XMLHttpRequest - 查询参数 1.5 XMLHttpRequest - 数据提交 2.Promise 2.1 Promise认识 2.2 Promise - 三种状态 2.3 案例 3.封装简易版 axios 3.1 封装_简易axios_获取省份列表 3…...
oracle avg、count、max、min、sum、having、any、all、nvl的用法
组函数 having的使用 any的使用 all的使用 nvl 从执行结果来看,nvl(列名,默认值),nvl的作用就是如果列名所在的这一行出现空则用默认值替换...
Python一分钟:装饰器
一、装饰器基础 函数即对象 在python中函数可以作为参数传递,和任何其它对象一样如:str、int、float、list等等 def say_hello(name):return f"Hello {name}"def be_awesome(name):return f"Yo {name}, together were the awesomest!"def gr…...
Docker部署ddns-go教程(包含完整的配置过程)
本章教程教程,主要介绍如何用Docker部署ddns-go。 一、拉取容器 docker pull jeessy/ddns-go:v6.7.0二、运行容器 docker run -d \--name ddns-go \--restart unless-stopped \...
简单多状态dp第三弹 leetcode -买卖股票的最佳时机问题
309. 买卖股票的最佳时机含冷冻期 买卖股票的最佳时机含冷冻期 分析: 使用动态规划解决 状态表示: 由于有「买入」「可交易」「冷冻期」三个状态,因此我们可以选择用三个数组,其中: ▪ dp[i][0] 表示:第 i 天结束后,…...
游戏化在电子课程中的作用:提高参与度和学习成果
游戏化,即游戏设计元素在非游戏环境中的应用,已成为电子学习领域的强大工具。通过将积分、徽章、排行榜和挑战等游戏机制整合到教育内容中,电子课程可以变得更具吸引力、激励性和有效性。以下是游戏化如何在转变电子学习中发挥重要作用&#…...
php+mysql安装
1.卸载mysql 没启动不停止 2.下载 3.解压 4.点击安装 5.出现成功 端口占用修改 修改端口89或者87 可视化扩展 修改后重启 开启扩展...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
