JAVA的内存图理解

目录

  • 一、方法区
    • 1、类常量池
    • 2、静态常量池
    • 3、方法区过程
  • 二、栈
  • 三、堆
    • 1、字符常量池
    • 2、堆内存图的绘制

java中内存可以分为 方法区程序计数器本地方法栈,其中比较中重要的是方法区、堆、栈。

一、方法区

1.方法区(Method Area)与Java堆一样,是各个线程共享的内存区域。

2.方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的。
3.方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。
4.方法区的大小决定了系统可以保存多少个类,加载项目中的类同时将类中的方法和属性加载到方法区当中
5.关闭JVM就会释放这个区域的内存。
提供两个类Person和Test类,其中Person类定义如下:

package 内存图;public class Person {public int age;public String name;public static int flag;public void m1() {}public static void m2() {}@Overridepublic String toString() {return "Person [age=" + age + ", name=" + name + " flag = "+flag+"]";}}

Test类定义如下:

package 内存图;public class Test {public static void main(String[] args) {Person x1 = new Person();x1.age = 20;x1.name = "11";x1.flag = 1;Person x2 = new Person();x2.age = 22;x2.name="22";x2.flag = 2;System.out.println(x1);System.out.println(x2);change1(x1,x2);System.out.println(x1);System.out.println(x2);change2(x1,x2);System.out.println(x1);System.out.println(x2);}public static void change1(Person a,Person b) {Person temp = a;a=b;b=temp;}public static void change2(Person a,Person b) {int temp_age = a.age;String temp_name = a.name;a.age = b.age;a.name = b.name;b.age = temp_age;b.name = temp_name;}
}

分析上述的两个类中的情况:
Person:
属性:age(int)name(String)flag(static int)
方法:m1(),m2()(Static) ,toString()
Test:
属性:空
方法:main()(static),change1(Peson a,Person b),change2(Person a,Person b)(static)

1、类常量池

类常量池里面存储的是类的信息,其中存储java类中的方法和属性即上述的Person和Test类。其中存储的情况如下:
其中被static静态定义的方法和属性标记为红色,此时内存没有给类分配内存地空间,因此其中定义的方法和属性由于没有分配内存空间不可以被使用(static定义的方法和属性除外。)
在这里插入图片描述

2、静态常量池

静态常量池用于存储类常量池中被static修饰过的方法和属性,并且为这些方法和属性分配内存空间,因此属性被分配内存空间后,属性会存在其类型的默认值
在这里插入图片描述

3、方法区过程

在这里插入图片描述
类被加载到类常量池中并且获得其中的方法和属性,但是此时没有给方法和属性分配内存空间,即对象没有被定义时无法获得其中的没有被static修饰过的方法和属性,被static修饰过的会被分配内存空间,即使没有创建对象的时候仍可以使用其中的方法和属性

二、栈

栈有一个特点为后入先出,首先被加载到栈中的方法最后出栈,最后入栈的方法,最先出栈。main()为程序的入口,因此栈中首先加载main()方法,直到方法结束。
main()方法中的执行代码如下:

	Person x1 = new Person();x1.age = 20;x1.name = "11";x1.flag = 1;Person x2 = new Person();x2.age = 22;x2.name="22";x2.flag = 2;System.out.println(x1);System.out.println(x2);change1(x1,x2);System.out.println(x1);System.out.println(x2);change2(x1,x2);System.out.println(x1);System.out.println(x2);

根据main()方法中创建变量,创建变量如下:由于x1和x2都是非基本数据类型,因此变量中存储的是堆中的内存地址。,当方法出栈之后,变量也会被回收。
在这里插入图片描述
并且main()中的方法按照顺序依次执行,遇到变量时会创建变量,遇到方法时会将方法加入到栈当中。
当方法全部入栈之后:
在这里插入图片描述
根据后入先出:
在这里插入图片描述
最后:main()方法出栈,栈空
在这里插入图片描述

三、堆

堆内存通常有较大的空间供程序使用,其大小受限于系统的有效虚拟内存,除基础类型以外的复杂数据类型的创建都在堆中操作,由堆分配内存空间供变量使用,例如数组、对象、字符串、列表

1、字符常量池

字符串常量池是Java中一个重要的概念,用于优化字符串的存储和使用。它的主要目的是提高性能和减少内存开销。在字符串定义时,为了避免重复定义浪费空间,创建字符常量池,每一次定义字符串时会判断字符常量池中是否包含该字符串,如果包含会直接将其内存地址赋值给变量名,不存在时会在字符常量池中创建,被创建的字符串在未被使用时不会被立刻回收。

2、堆内存图的绘制

经过下面的代码之后,堆中会创建出下面的情况

		Person x1 = new Person();x1.age = 20;x1.name = "11";x1.flag = 1;

在这里插入图片描述
因为flag位于静态常量池当中,因此创建的对象实例中不包含flag,修改时会直接修改静态常量池中的flag。
在这里插入图片描述

		Person x2 = new Person();x2.age = 22;x2.name="22";x2.flag = 2;System.out.println(x1);System.out.println(x2);

经过上面的代码之后,堆中会创建出下面的情况:
在这里插入图片描述
并且会打印x1和x2。

		change1(x1,x2);System.out.println(x1);System.out.println(x2);

经过上面的代码之后,栈中会载入change1()的方法,堆中会创建出下面的情况:
在这里插入图片描述
此时x1和x2中的并未发生交换,方法结束后会消除该方法。

		change2(x1,x2);System.out.println(x1);System.out.println(x2);

在这里插入图片描述
结束后效果如下:
在这里插入图片描述
x1和x2中的age和name发生交换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899439.shtml

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

相关文章

基于Selenium的IEEE Xplore论文数据爬取实战指南

基于Selenium的IEEE Xplore论文数据爬取实战指南 一、项目背景与目标 IEEE Xplore作为全球知名的学术资源平台,收录了大量高质量科技文献。本教程将演示如何通过Python的Selenium库实现: 自动化获取指定领域论文列表(以"构音障碍"为例)完整提取论文标题、摘要、…

软件工程面试题(十二)

1、文件和目录(i/o)操作,怎么列出某目录下所有文件?某目录下所有子目录,怎么判断文件或目录是否存在?如何读写文件? 列出某目录下所有文件:调用listFile(),然后判断每个File对象是否是文件可以调用 isFile(),判断是否是文件夹可以调用isDirectory(),判断文件或目…

医疗CMS高效管理:简化更新维护流程

内容概要 医疗行业内容管理系统(CMS)的核心价值在于应对医疗信息管理的多维复杂性。面对诊疗指南的动态更新、科研数据的快速迭代以及多机构协作需求,传统管理模式往往面临效率瓶颈与合规风险。现代化医疗CMS通过构建结构化权限管理矩阵&…

谈谈Minor GC、Major GC和Full GC

目录 一、背景 二、三者之间的区分 1、Minor GC 2、Major GC (1)老年代空间不足: (2)晋升(Promotion)失败: (3)空间分配担保失败: &#x…

C盘清理技巧分享:PE Dism++ 空间清理篇

C盘清理技巧分享:PE & Dism 空间清理篇 C盘空间不足是许多用户面临的常见问题,尤其是在使用 Windows 系统时。本文将重点介绍如何使用 PE(Preinstallation Environment)和 Dism 工具高效清理 C盘空间,释放宝贵的存…

低功耗LPWAN模块开发指南:远距离无线通信与边缘计算融合实战‌

在远程资产追踪、野外环境监测等场景中,稳定可靠的长距离通信与超低功耗是系统设计的核心挑战。eFish-SBC-RK3576通过 ‌原生双UART接口 USB OTG扩展能力‌ ,可无缝集成主流LPWAN模组(LoRa/NB-IoT),实现“数据采集-边…

迅为iTOP-RK3576人工智能开发板Android 系统接口功能测试

2.1 开机启动 开发板接通电源,并按下电源开关,系统即启动,在启动过程中,系统会显示下图中的开机画面,它们分别是 Android 系统启动时的 Logo 画面: 最后会显示如下解锁画面: 2.2 命令终端 将…

RAG基建之PDF解析的“无OCR”魔法之旅

PDF文件转换成其他格式常常是个大难题,大量的信息被锁在PDF里,AI应用无法直接访问。如果能把PDF文件或其对应的图像转换成结构化或半结构化的机器可读格式,那就能大大缓解这个问题,同时也能显著增强人工智能应用的知识库。 嘿,各位AI探险家们!今天我们将踏上了一段奇妙的…

二层框架组合实验

实验要求: 1,内网IP地址使用172.16.0.0/16分配 2,SW1和sw2之间互为备份 3,VRRP/STP/VLAN/Eth-trunk均使用 4,所有PC均通过DHCP获取IP地址 5,ISP只能配置IP地址 6,所有电脑可以正常访问ISP路由器环回 实验思路顺序: 创建vlan eth-trunk 划分v…

光纤耦合器

以下是关于光纤耦合器的详细介绍: 定义与原理 - 定义:光纤耦合器是一种能使传输中的光信号在特殊结构的耦合区发生耦合,并进行再分配的器件,也叫分歧器、连接器、适配器、光纤法兰盘。 - 原理:利用不同光纤面紧邻光纤芯…

惠普(HP)和联想(Lenovo)作为全球两大电脑品牌,并不是简单的“拼接电脑”

惠普(HP)和联想(Lenovo)作为全球两大电脑品牌,并不是简单的“拼接电脑”,它们都有自己的核心技术、专利设计和生态体系。以下是它们“自己的”核心部分: 1. 关键自研技术 品牌自研技术/专利说明…

若依赖前端处理后端返回的错误状态码

【背景】 后端新增加了一个过滤器,用来处理前端请求中的session 若依赖存放过滤器的目录:RuoYi-Vue\ruoyi-framework\src\main\java\com\ruoyi\framework\security\filter\ 【问题】 后端返回了一个状态码为403的错误,现在前端需要处理这…

智能的数学公式:Intelligence = Priori knowledge * Reasoning ?

爱因斯坦的相对论公式大道至简, 假如智能有公式的话,会不会是: 其中,两个影响因子分别是先验知识 和 推理能力,推理能力的指数部分可以是整数也是小数,但是暂时还不好确定。 解析:&#xff08…

简单使用LlamaIndex实现RAG

简单使用LlamaIndex实现RAG 1 介绍 LlamaIndex是一个专门为大语言模型(LLM)设计的开源数据管理工具,旨在简化和优化LLM在外部数据源中的查询过程。适合在数据索引上构建RAG。 参考的地址 # 官网地址 https://docs.llamaindex.ai/en/stabl…

Redis延时队列在订单超时未报到场景的应用补充说明

一、工具类设计要点解析 连接保活机制 Scheduled(cron "0 */10 * * * ?") 定时任务每10分钟向所有队列发送心跳消息("keepAlive"),避免云Redis因空闲断开连接。这是针对云服务商自动回收空闲连接的通用解决方案1。 泛…

理解Kubernetes中CoreDNS域名解析与DNS策略

CoreDNS是什么 CoreDNS是一个灵活可扩展的DNS服务器,使用Go语言编写,旨在提供快速、灵活的DNS服务 为什么需要CoreDNS CoreDNS为Kubernetes集群内部的DNS解析提供服务,使得服务之间能够通过域名互相通信 Kubernetes集群中, CoreDNS是运行在…

日报日报流量分析

快捷键 CtrlK,选择需要抓包的网卡 CtrlF可以进行关键字搜索 CtrlM,标记数据包 CtrlShiftN跳到标记处 查看包有多少协议Protocol Hierarchy(协议分级) 搜了一下TCP协议,是互联网最基本的协议&#xff0…

docker-Dify外接Fastgpt知识库

参考地址:https://mp.weixin.qq.com/s/crQrneHZ0sT-c04YanofSw 总体步骤 部署fda(fastgpt-dify-adapter)docker 部署dify,fastgpt在fastgpt创建open apikey,复制知识库id;在dify外接fastgpt知识库; docker安装 下载…

蓝桥杯 之 图论基础+并查集

文章目录 习题联盟X蓝桥幼儿园 图论基础 并查集 并查集,总的来说,操作分为三步初始化(每一个节点的父亲是自己),定义union(index1,index2)函数,定义find(index)函数 并查集详细内容博客 习题 联盟X 联盟X 典型的求解连通分支…

JavaScript运算符与逻辑中断

目录 JavaScript运算符 一、运算符分类与优先级 1. 运算符优先级表 二、算术运算符 1. 基础算术运算 2. 自增/自减运算符 三、比较运算符 1. 基础比较 2. 相等性判断 四、逻辑运算符 1. 基础逻辑运算 2. 短路求值(Short-Circuiting) 3. 逻辑…