程序计数器
相当于指令指针,记录运行指令的地址。
chatacter | desctiption |
---|---|
每条线程拥有独立程序计数器(线程私有) | 每条线程需要自身恢复 |
唯一无OutOfMemoryError 区域 |
java 方法在虚拟机内存,计数器记录地址<br />native 方法在宿主机,计数器无地址,管理不到 |
Java
虚拟机栈
方法运行模型
每个方法执行,都会创建栈帧(
stack frame
),然后在java
虚拟机栈中进行入栈和出栈操作。局部变量表
存储基本数据:
int
,byte
,boolean
,char
,short
,float
,long
,double
以及
reference
数据,即对象引用,指向对象指针引用
character | description |
---|---|
线程私有 | 或中途挂起,独立记录 |
存储数据 | 局部变量表<br />操作数栈<br />动态链接<br />方法出口 |
OutOfMemoryError |
空间被限制,超出会报错 |
StackOverFlowError |
深度被限制,超出会报错 |
本地方法栈
虚拟机中的方法有两种:
-
java
方法 -
native
方法
其中native
方法更像是接口定义,它可以由其他语言进行实现,然后虚拟机通过接口进行查找得到。
直白的表述就是,native
的执行过程并不由虚拟机进行操控,而仅仅是作为管理容器。
-
java
虚拟机栈是java
方法执行栈 - 本地方法栈是
native
方法执行栈
Java堆
scope | description | more |
---|---|---|
基本属性 | 线程共享 | 启动创建 |
对象分配 | 对象都在堆内进行分配 | 栈上分配,标量替换 |
垃圾手机 | 垃圾收集主体区域 | 新生代<br />老年代<br />eden <br />from survivor <br />to survivor <br />TLAB 线程私有缓冲区 |
容量限制 | 超出容量OutOfMemoryError
|
-Xmx <br />-Xms
|
方法区
attribute | description | |
---|---|---|
线程共享 | 各线程共享 | |
数据存储 | 存储已经加载的数据 | 类信息<br />常量<br />静态变量<br />即时编译器代码 |
垃圾回收 | 常量池回收<br />类型卸载 | 可不实现垃圾回收<br />原永久代实现回收<br /> |
容量限制 | 超出限制OutOfMemoryError
|
运行常量池
scope | description |
---|---|
坐标地址 | 方法区中 |
存储内容 | 编译时的字面量和符号引用 |
放入时机 | 编译期<br />运行期 |
内存限制 | OutOfMemory |