运行时数据区域
java会在运行时分配管理的内存
程序计数器
当前线程所执行的字节码行号指示器
通过改变程序计数器的值来选取下一条需要执行的字节码指令
java 每个线程都需要一个独立的程序计数器
唯一一个没有oom的区域
虚拟机栈
线程私有 生命周期与线程相同
方法执行时创建一个栈帧 方法调用到完成的过程就是栈帧从虚拟机栈中入栈到出栈的过程
栈帧是方法运行的基础数据结构
栈内存讲的是虚拟机栈 对应的局部变量表
局部变量表所需的内存空间在编译期分配
栈可以存放 基本数据类型 boolean byte chat short int float long double 对象引用 reference 并不是对象本身
如果线程请求的栈深度大于虚拟机允许的深度 StackOverflowError
虚拟机可以动态扩展 当扩展无法申请到最够内存时 OutOfMenoryError
本地方法栈
虚拟机栈执行java方法 本地方法栈执行虚拟机用到的Native方法 可以合并
堆
堆是所有线程共享的内存区域 在虚拟机启动是创建 唯一目的是存放对象实例
堆可以处于逻辑上连续,物理上不连续的内存空间中。
可以固定大小 也可以扩展 堆溢出oom
方法区
方法区线程共享区域 用与存储已被虚拟机加载
的类信息 常量 静态变量 编辑器编译后的代码
垃圾收集行为在这个区域比较少见 内存回收主要是针对常量池的回收和对类型的卸载
运行时常量池
运行时常量池是方法区的一部分 Class文件中除了版本、字段、方法、接口、描述等信息外 还有一项信息为常量池 用与存放编译期生成的各种字面量和符号引用 在类加载后
存放到常量池
翻译出来的直接引用也放在运行时常量池中
直接内存
不是虚拟机运行时数据的一部分
java程序执行过程
1 | public class Demo{ |
javap -c -l Demo
1 | public class Demo { |
I'm so cute. Please give me money.
- Post link: http://dongkw.github.io/2020/03/17/%E8%99%9A%E6%8B%9F%E6%9C%BA/
- Copyright Notice: All articles in this blog are licensed under unless stating additionally.
若没有本文 Issue,您可以使用 Comment 模版新建。
GitHub Issues