Java内存模型

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异常

标签

评论

this is is footer