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.pswp.cn/news/915293.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915293.shtml
英文地址,请注明出处:http://en.pswp.cn/news/915293.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode编辑Markdown文件

一.安装Markdown的插件 vscode的扩展,搜索Markdown Preview Enhanced的插件,并安装。 其他的常用插件,还包括: Markdown All in One :提供了许多有用的功能,如快捷键支持、自动预览、TOC(目录&…

【PTA数据结构 | C语言版】查找树中带有指定数据的结点

本专栏持续输出数据结构题目集,欢迎订阅。 文章目录题目代码题目 请编写程序,创建有 4 个结点的树,然后查找给定的 x。 输入格式: 输入首先在第一行给出 4 个正整数,依次对应树的根结点、根的第 1、2、3 个孩子结点的…

PostgreSQL常用命令与工具指南

文章目录PostgreSQL常用命令与工具指南简介1. 连接与基本操作连接数据库环境变量设置(避免密码输入)常用元命令2. 数据库与表管理数据库操作创建数据库删除数据库修改数据库属性表操作创建表修改表结构删除表索引管理创建索引删除索引3. 数据操作(CRUD)插…

SpringBoot项目部署至云服务器

目录 一、后端项目部署 1、修改配置文件 2、清理打包缓存,打jar包(两种方式二选一) 自动打包 手动打包 打包成功状态 3、将jar包导入宿主机上 jar包位置 jar包上传 jar包运行 浏览器测试 二、前端代码 docker搭建nginx的基本步骤 打…

Agent-S:重新定义下一代 AI 智能体开发框架

Agent-S:重新定义下一代 AI 智能体开发框架 —— 探索 simular-ai 的开源革命 引言 2025 年,AI 智能体(Agent)技术正从概念走向产业核心。从自动化工作流到复杂决策系统,开发者亟需更高效的工具链。在这一背景下&am…

保持视频二维码不变,如何更新视频内容,节省物料印刷成本

保持视频二维码不变,如何更新视频内容,节省物料印刷成本? 视频替换功能,是指在保持视频二维码不变、视频观看地址不变、视频调用代码不变的情况下替换视频内容,从而节省用户印刷物料的成本,满足用户更新视…

flutter项目调试问题小结

背景 目标是用android studio flutter 跑hello world 下载 android studio 我下载的是2024.3.2.15版本 最新版下载首页就能下:下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 历史版本可在归档列表下载:Android Studio…

明细列表,明细grid中的默认按钮失效,配置按钮失效

明细列表,明细grid中的默认按钮失效,配置按钮失效原因:采用通配的写法导致的默认按钮失效if(menuDetails){menuDetails.forEach((item) > {const { name, menu_detail_columns, menu_detail_buttons, save_url} item;this.set(${name}Gri…

Matplotlib 30分钟精通

📊 Matplotlib 30分钟精通计划(完整版含输出) ⏰ 时间分配 5分钟:Matplotlib基础概念和简单图表 10分钟:常用图表类型详解 10分钟:图表美化和定制 5分钟:综合实战练习 📚 第一部分:Matplotlib基础概念 (5分钟) 1. 什么是Matplotlib? import matplotlib.pyplot a…

7月19日 暴雨蓝色预警:全国多地迎强降雨,需防范次生灾害

中央气象台7月19日10时继续发布暴雨蓝色预警,预计未来24小时(19日14时至20日14时),我国多地将迎来大到暴雨,局地甚至出现大暴雨,并伴有短时强降水、雷暴大风等强对流天气,需加强防范。 强降雨覆盖范围广,多地需警惕极端降水 此次降雨影响范围广泛,涉及华北、华南、西…

Redis学习-05Redis基本数据结构

Redis 数据结构 String 字符串 基本命令表命令执行效果时间复杂度set key value [key value…]设置 key 的值是 valueO(k), k 是键个数get key获取 key 的值O(1)del key [key …]删除指定的 keyO(k), k 是键个数mset key value [key value …]批量设置指定的 key 和 valueO(k),…

开启modbus tcp模拟调试

1、新建modbus tcp服务器 ‌功能差异‌‌客户端功能‌: 生成并发送Modbus请求报文(如功能码03读取寄存器)。‌‌ 解析服务器响应数据,实现远程监控或控制。‌‌ ‌服务器端功能‌: 监听默认端口(如502&…

昇思+香橙派 AI 开发实践:DeepSeek 全流程指南(基于 openEuler)

一、 环境准备 1. 镜像烧录 镜像烧录可以在任何操作系统内执⾏,这⾥以在Windows系统为例,使用balenaEtcher⼯具,快速烧录镜像到Micro SD卡中。 本章节所需的软/硬件如下: 软件相关:balenaEtcher制卡⼯具、openEul…

AI生成邮件发送脚本(带附件/HTML排版)与定时爬取网站→邮件通知(价格监控原型)

想象一下:每天早晨咖啡还没喝完,你的邮箱就自动收到了心仪商品的最新价格;重要报告准时带着专业排版的附件发送到客户手中——这一切不需要你手动操作。本文将用不到100行代码带你实现这两个自动化神器! 一、为什么我们需要自动化…

【vLLM 学习】Encoder Decoder Multimodal

vLLM 是一款专为大语言模型推理加速而设计的框架,实现了 KV 缓存内存几乎零浪费,解决了内存管理瓶颈问题。 更多 vLLM 中文文档及教程可访问 →https://vllm.hyper.ai/ *在线运行 vLLM 入门教程:零基础分步指南 源码 examples/offline_inf…

【MySQL笔记】视图

目录一、什么是视图?二、使用视图的优势三、视图的创建与使用四、不能更新视图的场景五、删除视图六、总结一、什么是视图? 视图(View)是一种虚拟表,不存储实际数据,而是通过执行预定义的查询动态生成数据…

【RK3576】【Android14】分区划分

获取更多相关的【RK3576】【Android14】驱动开发,可收藏系列博文,持续更新中: 【RK3576】Android 14 驱动开发实战指南

Datawhale 25年7月组队学习coze-ai-assistant Task1学习笔记:动手实践第一个AI Agent—英伦生活口语陪练精灵

Chap1 了解AI工作流 1.1什么是工作流 工作流 就像是一条流水线,把复杂的任务拆分成多个简单的步骤,每一步都有明确的目标和流程。1.2智能体和工作流的区别 智能体(AI Agent) **是什么 :**智能体是一个自动化的“助手”…

Webpack插件开发深度指南:从原理到实战

Webpack插件是前端工程化的核心引擎,本文将带你深入插件开发全流程,实现一个功能完整的资源清单插件,并揭示Tapable事件系统的核心原理。 一、Webpack插件机制解析 1.1 插件架构核心:Tapable事件系统 Webpack基于Tapable构建了…

2、Redis持久化详解

Redis持久化详解 文章目录 Redis持久化详解 前言 RDB和AOF的区别 RDB和AOF的优缺点 Redis 持久化配置 1、RDB持久化配置 2、AOF持久化配置(尝试修复会删除aof文件内容) 3、AOF 重写功能 新增知识点: 新增知识点: 前言 Redis是一种高级 key-value 型的NoSQL数据库。它跟mem…