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

Java基础06(代码运行时的内存图)

目录

一、引入

二、Java下的内存分配

1.类信息常量池和静态常量池

2. 栈和字符串常量池

(引进)线程

3.⭐程序计数器作用⭐(程序计数器配合栈使用)

总结Java内存:

(引进)驱动

三、引用传递和值传递

值传递:Java,C,C++

引用传递和值传递的具体应用场景:

引用传递和值传递的优缺点:


一、引入

进程都是在内存中独占一块空间互不干扰:

操作系统就是C语言写的(硬件驱动是C语言,相互适配可以达到更优速度,所以操作系统也是C语言编写),所以操作系统只认识C语言,其他高级语言最终也会被翻译成C语言,即能在操作系统上运行的语言,本质上都被转化成C语言了。

不管何种语言,本质上都是通过C语言向操作系统申请足够大的一段数组,如下Java版本(指针划分):

二、Java下的内存分配

1.类信息常量池和静态常量池

【如上所示:静态可以被非静态调用(静态常量池内的静态方法和变量相当于设计图中已经被造好的零件,可以直接使用);非静态能被非静态调用(非静态相当于图纸设计图,互相能够'摘抄'调用),但是非静态不能被静态调用(即:图纸不能被零件调用)】

2. 栈和字符串常量池

一个方法被调度时,入栈,当这个方法位于栈首时,则将处于运行状态,否则不会运行,当且仅当其处于栈首时,才会再次运行;

方法被调用进栈,是被拷贝一份进栈,而不是直接存入栈;

String和int类型不同,String类型的句柄和值不在一块,这是因为一旦String类型的值发生改变,其内部所占用内存也会发生改变,但是int类型不管如何变动,都是32bit;

 

如图表示,Person类中的静态方法相当于只有一份固定放在静态常量池,而非静态方法(相当于图纸),被new多少次,就有多少份;

静态方法可以通过类.或方法名.调用,非静态方法只能通过方法名.的方法调用;

一个对象在内存中实际(左图和右图):

其他地方申请的空间会被Java摧毁自动回收,但是常量池中的不会,具体参见这篇文章--->一篇帮你搞懂Java常量池-CSDN博客

(引进)线程

进程是由线程组成的,线程是-->依托栈结构,完成了一条线的方法的调用;线程的组成单位是方法。

3.⭐程序计数器作用⭐(程序计数器配合栈使用)

  • 控制指令顺序‌:程序计数器用于控制指令的执行顺序。它指示计算机在其指令序列中的位置,确保指令按顺序执行。
  • ‌存储下一条指令的地址‌:程序计数器存储下一条指令的地址,确保‌CPU能够正确地获取和执行下一条指令。
  • ‌在中断时保存当前指令‌:当发生中断时,程序计数器会保存当前正在执行的指令的地址,以便在中断处理完毕后能够恢复到中断前的状态,继续执行程序。
  • 程序计数器的工作原理:
  • 程序计数器在每个指令执行完毕后会自动增加,指向下一条指令的地址。如果发生跳转或分支,程序计数器的值会由转移指针给出新的指令地址。程序计数器确保CPU能够连续地执行指令,实现程序的顺利运行。

总结Java内存:

(引进)驱动

程序的运行离不开硬件,硬件的运行离不开驱动。

三、引用传递和值传递

传递有引用传递(e.g句柄的地址的传递)和值传递(e.g对象地址的传递)

值传递:Java,C,C++

  • ‌引用传递(Pass by Reference)‌是指在调用函数时将实际参数的地址传递到函数中,这样在函数中对参数所进行的修改,将影响到实际参数。这意味着多个变量可以通过引用传递共享同一个内存地址。‌
  • ‌值传递(Pass by Value)‌是指在调用函数时将实际参数的值复制一份传递给函数,这样当函数对形参进行修改时,不会影响到实际参数。每个变量都有自己的内存地址,互不影响。

引用传递和值传递的具体应用场景:

  • 引用传递适用于需要修改传入参数的情况,例如在需要返回多个结果或者需要对传入参数进行修改时。值传递适用于不需要修改传入参数的情况,例如在只需要读取数据时。

引用传递和值传递的优缺点:

  • 引用传递的优点是可以直接修改传入参数,减少数据复制的开销。缺点是需要注意避免对传入参数的意外修改。值传递的优点是传入参数不会被修改,安全性高。缺点是需要复制数据,可能会增加开销

 


http://www.mrgr.cn/news/65836.html

相关文章:

  • 微信小程序 https://pcapi-xiaotuxian-front-devtest.itheima.net 不在以下 request 合法域名
  • Docker篇(容器的备份与迁移)
  • dockerdockerfiledocker-compose操作
  • PHP露营地管理平台小程序系统源码
  • Android 各版本 TLS 协议支持及启用方式
  • 开源OCR免费助力法律文档数字化,提升文档管理效率
  • 基于matlab的图像形状与分类的方法比较
  • Windows基础2(病毒编写)
  • WordPress站点网站名称、logo设置
  • C语言 | Leetcode C语言题解之第538题把二叉搜索树转换为累加树
  • 科研绘图系列:R语言圆堆积图(circle stacked plot)
  • Nginx线程模型
  • 【AIGC】如何通过ChatGPT轻松打造个性化GPTs应用
  • 【数据结构- 合法括号字符串】力扣1190. 反转每对括号间的子串
  • 代码训练营 day55|卡码网98
  • Linux:网络协议socket
  • 高频面试题基本总结(含笔试高频算法整理)回顾44
  • 从最小作用量原理推导牛顿三大定律
  • 简单题:环状 DNA 序列的最小表示法| 豆包MarsCode AI刷题
  • PGMP练-DAY16
  • Android沙箱
  • 不画饼——研究生学习和赚钱的平衡点
  • 【鸿蒙】开发者攻略:借力鸿蒙生态,打造全场景应用新体验
  • Javascipt基础__1
  • 嵌入式开发之文件I/O-函数
  • 1003-leetcode补打卡 最长公共前缀