JVM篇:JVM内存结构

程序计数器

程序计数器英文名叫:Program Counter Register

作用:用来记录下一条jvm指令的地址行号。

先来查看一段jvm指令,这些指令对应的java代码就是输出1-5

操作系统运行该Java程序时具体流程如下

语言解释:源文件通过编译转化为二进制字节码文件后,解释器会获取第一行jvm指令后解释为机器码供CPU执行,与此同时程序计数器记录下一条jvm指令的行号,随后解释器从程序计数器中获取应该解释哪条jvm指令供CPU执行,由于程序计数器需要频繁的更新jvm行号,为了保证响应速度,jvm在设计时采用寄存器实现程序计数器。

特点:

  • 线程私有(即当CPU在执行线程1过程中去执行线程2,程序计数器会保留线程1的下一条指令的地址行号,等到线程1恢复执行时接着下一条指令接着执行。每个线程都有自己的程序计数器)
  • 是JVM唯一一个不会存在内存溢出问题区域。

虚拟机栈

每个线程所需要的内存空间我们使用虚拟机栈来表示(早期也叫Java栈),每个栈由栈帧组成,栈帧对应的是方法调用时所需的内存,每个线程只存在一个活动栈帧,即正在执行的方法

接下来,我们结合代码理解虚拟机栈

在上述代码中,当我们执行到method2方法时,栈帧一共存在3个分别是main方法的栈帧,method1的栈帧与method2的栈帧,并且method2的栈帧在栈的顶部

栈问题

垃圾回收是否涉及栈内存

垃圾回收器针对的是堆内存中无用的对象,而栈内存对应的是调用方法所需要的内存,而方法执行结束后会自动释放内存,因此垃圾回收并不需要管理栈内存。

栈内存分配越大越好吗

并不是。电脑的内存大小是固定的,栈内存分配越多可能会导致线程数量减少。比如一个内存为500M的电脑,栈内存分配为1M,则理论说该电脑可以存在500个线程,如果栈内存分配为2M,则理论线程就为250个。

方法的局部变量是否线程安全

对于变量是否是线程安全,主要是看该变量是共享的还是私有的。

相关推荐
cmpxr_16 分钟前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
2401_8274999929 分钟前
python项目实战09-AI智能伴侣(ai_partner_5-6)
开发语言·python
PD我是你的真爱粉31 分钟前
MCP 协议详解:从架构、工作流到 Python 技术栈落地
开发语言·python·架构
win x1 小时前
Redis 使用~如何在Java中连接使用redis
java·数据库·redis
星晨雪海1 小时前
基于 @Resource 的支付 Service 多实现类完整示例
java·开发语言
阿维的博客日记1 小时前
什么是逃逸分析
java·juc
Mr_Xuhhh1 小时前
深入理解JVM:从原理到实践的完整指南
jvm
ACP广源盛139246256731 小时前
破局 Type‑C 切换器痛点@ACP#GSV6155+LH3828/GSV2221+LH3828 黄金方案
c语言·开发语言·网络·人工智能·嵌入式硬件·计算机外设·电脑
Ricky_Theseus2 小时前
C++右值引用
java·开发语言·c++
Rick19932 小时前
Java内存参数解析
java·开发语言·jvm