JVM(一):运行时数据区

  更新中,主要参考为 官网:

  https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html

1. 程序计数器

  程序计数器 是线程私有的,一个线程在某一时刻,只执行一个方法,如果这个方法,非native,不是本地方法,程序计数器保存 当前线程正在执行的字节码指令地址;执行器 根据PC中保存的 地址,取出 下一条要执行的字节码指令,然后执行它,执行完后,pc会自动更新为下一条指令的地址。当线程调用的方法是native方法,pc就没有意义了,就是undifined。

2. 虚拟机栈

  虚拟机栈 是 线程私有 的,存储单位是 栈帧,保存 局部变量(方法的参数 和 在方法中定义的局部变量) 和 部分结果。栈是由 多个栈帧组成的 后进先出的数据结构,每个方法调用时,会压入一个新的栈帧,方法执行完,弹出这个栈帧。

  栈在线程创建时创建,在线程结束时销毁。

  与虚拟机栈相关的异常:① StackOverflowError:当方法调用深度过大,比如 无限递归,不断地push新栈,导致超过栈容量;② OutOfMemoryError :无法申请到足够的内存 来满足栈的需求:动态扩展栈失败/线程创建 失败。

3. 堆

  线程共享; 堆 是运行时数据区域,所有 类实例 和 数组的内存,都从该区域分配。

  堆在虚拟机启动时创建,堆内存不需要是连续的。

  堆的异常:OutOfMemoryError,gc 无法回收出足够空闲空间,满足本次分配请求。

  堆与栈的关系:栈存引用,堆存对象。

  堆与方法区的关系:堆存运行时对象实例;方法区 存类的结构信息(蓝图),如 类名、方法代码、字段描述。

4. 方法区

  线程共享;方法区 存储 每个类的结构,例如:运行时常量池(每个类自己的常量池:符号引用、字面量),字段(字段名、类型、修饰符等)、方法数据(修饰符、方法类型、方法名、参数列表),方法字节码和构造函数代码,类的元数据(全限定类名、父类、实现的接口、访问修饰符、静态变量static);

  方法区在虚拟机启动时创建。方法区在逻辑上 是堆的一部分,物理上不一定,比如 1.7 以前,方法区的具体实现为"永久代",位于堆内;1.8 以后,由永久代 改为"元空间",使用本地内存。

  方法区 是一个规范,有不同的实现,不同的实现中,方法区的存储位置也不同。

相关推荐
tedcloud12343 分钟前
Docker Compose 部署 Memos:从安装到备份恢复
linux·开发语言·jvm·后端·docker·容器·rust
螺蛳粉 螺蛳粉2 小时前
大数据第四篇:事故复盘:移走 HBase 里 27 个 hadoop-2.10.2 jar 后,HMaster 半小时后“自杀“了【jar 事故复盘】
jvm·hadoop·hbase·异常处理·大数据运维·踩坑记录·事故复盘
wuminyu3 小时前
JVM规范学习总结-JVM规范基本概念
java·linux·c语言·jvm·c++
学到老活到老17 小时前
方法执行完了,对象为什么还占着内存?
java·jvm
骑着蜗牛撵大象3271 天前
四种库收进一个SQL编辑器(下):跨库取数、方言对齐与四库巡检的落地拆解
jvm·数据库·sql·编辑器·数据迁移·跨库查询
需要8262 天前
容器化 Java:镜像瘦身与 JVM 容器感知(cgroup)
java·开发语言·jvm
Pniubi2 天前
ConcurrentHashMap拆分线程池难点再讲
java·jvm
Irene19913 天前
Flink 学习日志 01:前端转大数据的实战避坑指南
java·jvm·flink
小天源4 天前
从 Nginx 日志到访问分析:轻量化网站监测服务的架构实践
jvm·nginx·网络安全·架构·网络监控
十年Java程序媛4 天前
JVM 内存区域与对象内存布局|new 对象底层流程,对象头 MarkWord 详解
java·jvm·spring boot