当前位置: 首页 > news >正文

java内存图

java内存图

  • java文件运行流程
  • 程序的内存空间
    • 认识虚拟机栈
      • 程序的执行流程
    • 认识堆
      • java的类与对象的关系

java文件运行流程

有这样的一份 java 文件

在这里插入图片描述

在该目录下的终端运行 javac Hello.java 命令,会生成 Hello.class 文件,内容如下:

在这里插入图片描述

Hello.java 打开是我们能够看懂的代码,也叫源代码文件,源代码文件是给咱们程序员去看的;而 Hello.class 文件这里边是二进制的字节码文件,二进制字节码文件是给计算机看的

此时当前这两份文件都在磁盘当中,都是在外部存储设备当中

当终端运行 java Hello 这个命令,能将当前的二进制文件从磁盘放到内存中交给 CPU 运行,然后输出 "hello world"

在这里插入图片描述

由于 java 这个命令可以将当前的二进制文件从磁盘放到内存中交给 CPU 运行,那么该程序在内存空间中是什么样的呢?接下来我们来讨论程序的内存空间部分。

程序的内存空间

数据类型决定数据在内存当中是如何存储的,正在运行的程序在内存当中都必须要有自己的内存空间,因为任何一个变量任何一个指针都需要内存空间来进行表达

数据在内存当中的存储位置是由操作系统所决定的,程序的运行需要操作系统给它开辟内存空间,当拥有这块内存空间后就由 java 程序自己去操作这一块内存空间,该内存空间会被切分为以下几个区域:

在这里插入图片描述

其中最重要的三个是 虚拟机栈、堆 和 方法区
虚拟机栈 控制着程序的执行;
是用来存储对象的;
方法区 用于存储虚拟机加载的存储类信息、常量、静态变量、临时数据等;
方法区中存储的也就是当前的 .class 文件

下面我们来具体讲解虚拟机栈和堆

认识虚拟机栈

我们来看这样一份代码文件:

在这里插入图片描述
终端运行结果:

在这里插入图片描述

下面我们来看程序的执行流程

程序的执行流程

程序的内存空间如下:

在这里插入图片描述
其中虚拟机栈的执行流程如下:

在这里插入图片描述

首先第一步 main 方法入栈,入栈后表达程序,对 “hello world” 做了输出,之后它会调用 run() 方法入栈。run() 方法进行表达,执行是从上到下执行,第一步先定义一个局部变量 num = 100,num 本身是一个 int 类型的指针, num 是指向100的地址,假设它的地址是 0x10 那么 num 就指向0x10,输出完了之后,调用 jump() 方法。jump() 方法里面也有一个局部变量 num,num 是从上边赋过来的值,相当于是做了一次值传递,相当于是把这个100传了过去,继续执行输出,jump() 也就执行完毕后出栈。那么又回到咱们当前这个 run() 方法了,run 方法此时执行完这一行之后也就会出栈了,这样就又回到 main() 方法了。main 方法中 run() 执行完毕 run() 出栈,main() 接着会去执行下一个方法 aaa(),aaa()入栈,有一个局部变量 byte a = 10,输出后 aaa 执行完 main 方法出栈,整个程序就执行完毕了。

程序的执行过程就是 main 方法从入站到出栈,程序执行第一步是main方法入栈最后一步一定是main方法出栈。程序从开始执行到执行完毕是由 main 方法来对其进行控制的,从上到下依次进行执行,整个流程就是程序的执行过程,程序的执行过程又被叫做 线程

引申:我们可以简单去理解 java 当中的多线程,要想实现 java 当中的多线程就意味着我们需要多个程序的执行过程,而如何实现 java 当中的多线程,就需要多个虚拟机栈

认识堆

在讲述堆之前我们先看 java 的类与对象的关系

java的类与对象的关系

有这样一份代码文件:

在这里插入图片描述
我们发现打印结果里的 tom 和 jr 的名字不一样

下面具体讲解:

new :关键字(java保留字,有实际含义)在堆内存中开辟内存空间
Cat() :构造器,是在创建对象的时候给对象赋值
tom对象名或叫做变量名
Cat数据类型(引用数据类型中的类),数据类型决定数据在内存当中是如何存储的
= :赋值操作,将对象的地址值赋给变量

程序执行第一步main方法入栈,之后它就会调用 Cat tom = new Cat();,首先 new 关键字会在堆里边开辟一块内存空间创建 tom 对象,由 Cat 数据类型决定数据在内存当中存储形式,Cat 里边有两个方法和一个变量, eat(String food)、catchMouse() 和变量 name=‘aaa’,会将该对象的地址值 0x1 赋给 tom 变量。
每 new 一次都要开辟新的内存空间,Cat jr = new Cat(); 会在堆中开辟一块内存空间创建 jr 对象,同样地在该对象中有 eat(String food)、catchMouse() 和变量 name=‘aaa’,该对象的地址值 0x2 赋给 jr 变量。为什么此时 tom 和 jr 的是相同的,因为他们具有相同的数据类型 Cat,相同的数据类型的内存形式是一样的。但是在 main 函数中 jr.name = "jr"; 对 jr 对象的 name 值进行了修改,这样 jr 调用 name 输出的就不再是 ‘aaa’ 了,而是 ‘jr’ 了。

在这里插入图片描述

一个类可以创建出多个对象,tom 和 jr 是两个不同的对象,但是它们的存储形式是相同的,相同的数据类型内存形式是一样的

类是创建对象的模板,那么模板里边有什么那类里边有什么,那对象当中就应该默认有什么

堆是用来存储对象的

总结:类是创建对象的模板,一个类可以创建多个对象
什么是 java 对象:堆内存当中的存储结构

http://www.xdnf.cn/news/1148329.html

相关文章:

  • 【Linux服务器】-MySQL数据库参数调优
  • Ubuntu 22.04.3 LTS 安装 MySQL
  • Kubernetes常用命令总结
  • 【逻辑回归】MAP - Charting Student Math Misunderstandings
  • 自由学习记录(70)
  • 《汇编语言:基于X86处理器》第8章 高级过程(3)
  • Python 代码生成 LaTeX 数学公式:latexify 参数 parameters
  • 【C语言进阶】结构体
  • Linux常用指令大全
  • 力扣经典算法篇-26-长度最小的子数组(暴力求解法,左右指针法)
  • Java 大视界 -- Java 大数据机器学习模型在自然语言处理中的对话系统多轮交互优化与用户体验提升(351)
  • ROS2 通过相机确定物品坐标位置
  • 在非Spring Boot的Spring项目中使用Lock4j
  • 开疆智能Profinet转ModbusTCP网关连接康耐视InSight相机案例
  • SPARKLE:深度剖析强化学习如何提升语言模型推理能力
  • 智慧资产管理系统需求文档
  • uniapp中腾讯地图SDK-安装及配置(自动定位回显城市)
  • Validation - Spring Boot项目中参数检验的利器
  • 打造高效订单处理!ZKmall开源商城的统一履约中心架构解析
  • UGUI 性能优化系列:第三篇——渲染与像素填充率优化
  • Vue3生命周期函数
  • ABP VNext + Kubernetes Istio:微服务网格实战指南
  • Word快速文本对齐程序开发经验:从需求分析到实现部署
  • 深度学习Depth Anything V2神经网络实现单目深度估计系统源码
  • Spring AI 项目实战(十八):Spring Boot + AI + Vue3 + OSS + DashScope 实现高效语音识别系统(附完整源码)
  • 市场数据+幸存者偏差提问,有趣的思考?
  • [论文阅读] 人工智能 + 软件工程 | 强化学习在软件工程中的全景扫描:从应用到未来
  • 异世界历险之数据结构世界(二叉树-leetcode)
  • 【2025最新】 .NET FrameWork微软离线运行库合集,一键安装版
  • 【C# in .NET】19. 探秘抽象类:具体实现与抽象契约的桥梁