Java内存模型
方法区
Runtime Constant Pool
Heap
Threads
JVM Stacks
局部变量区
操作数栈
动态链接
方法的返回地址
Native Method
程序计数器
JVM Stack:java虚拟机栈
Native Method:本地方法栈
每一个线程在运行时都会创建一个栈(一个虚拟机栈和一个本地方法栈)
程序计数器
每个线程对应有一个程序计数器
各线程的程序计数器是线程私有的,互不影响,是线程安全的
程序计数器记录线程正在执行的内存地址,以便被中断线程回复执行时再次按中断时的指令地址继续执行
java栈
每个线程会对应一个java栈
每个Java栈由若干栈帧组成
每个方法对应一个栈帧
栈帧在方法运行时创建并入栈;方法执行完,该栈帧弹出栈帧中的元素作为该方法的返回值,该栈帧被请清除
栈顶的栈帧叫活动栈,表示当前执行的方法
线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常
栈扩展时无法申请到足够的内存,会抛出OutOfMemoryError异常
方法区
方法区是Java堆的永久区
方法区存放了要加载的类的信息、类的静态常量、类的final类型常量、类中的Field信息、类中的方法信息
方法区是被Java线程共享的
方法区要使用的内存超过允许大小时,会抛出OutOfMemoryError:PremGen space
ConstantPool:
常量池是方法区的一部分
常量池中存储两类数据:字面量和引用量
字面量:字符串、final变量
引用量:类、接口、方法、字段的名称和描述符
常量池在编译期间就被确定,并保持在已编译的.class文件中
Native Method Stack
本地方法栈和jvm方法栈十分类似,区别是JVM方法栈是为Java方法服务,而本地方法栈为Java native方法服务
本地方法栈也会抛出stackOverflowError和OutOfMemoryError异常
近期评论