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个。

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

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

相关推荐
lilihuigz8 分钟前
Meta Box完整指南:WordPress自定义字段与内容框架高效构建结构化内容 - 易服客工作室
java·开发语言
xxie12379414 分钟前
Python 闭包的调用方法与实践
开发语言·python
aini_lovee16 分钟前
计算 HOG算子的典型 MATLAB 程序
开发语言·matlab
楷哥爱开发17 分钟前
降低网络爬虫成本:基础设施优化指南
服务器·开发语言·php
尚早立志34 分钟前
Spring Boot 源码研读之ConfigurableEnvironment 环境准备
java·spring boot·后端
YuK.W34 分钟前
Leetcode100: 94.二叉树中序遍历、104.二叉树最大深度、226.翻转二叉树
java·算法·leetcode·二叉树
乂爻yiyao41 分钟前
0. openems 部署与体验
java·openems
TanYYF1 小时前
spring ai入门教程一
java·人工智能·spring
掉鱼的猫1 小时前
用 ChatModel 构建 LLM 驱动的 Java 应用
java·llm
4154111 小时前
JTS 空间运算实战:线 × 线、线 × 面、面 × 面叠加分析
java·jts·叠加分析