jvm内存模型

先上一张jvm的图java

能够分为线程共享,和线程独有的两块内存。数据结构

1、程序计数器:一块较小的内存空间,当前线程执行字节码行号的指示器。也就是线程下一行须要干什么事,执行什么代码。若是线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;若是正在执行的是Native方法,这个计数器值则为空(Undefined)多线程

补充:一个cpu(单核,一个处理器)在某一个时刻只能执行一条线程中的指令,因此多线程是线程轮流切换并分配处理器执行时间来实现的,为了能在切换的时候恢复正确的执行位置,每一个线程要保存当前线程执行的位置,也就程序计数器私有了。jvm

2、虚拟机栈:描述的是java方法执行的内存模型,每一个方法执行都会建立一个栈帧,存放局部变量,方法出口等信息。每个方法调用到执行完成就是一个栈帧从入栈到出栈的过程。spa

一、局部变量存放的是编译期可知的基本数据类型(boolean,byte,chat,short,int,float,long,double),对象引用(reference, 指向对象起始地址的引用指针),returnAddress(指向了一条字节码指令的地址)线程

 二、局部变量所需的内存空间在编译时期就分配完成,在运行时期不会改变大小。指针

三、这个区域会出现两个异常,StackOverflowError,OutOfMemoryError对象

StackOverflowError:当线程请求的栈深度大于虚拟机所容许的深度。(固定长度的虚拟机栈)接口

OutOfMemoryError:当虚拟机栈动态扩展(大部分java虚拟机都支持动态扩展),若是扩展时申请不到内存就抛此异常内存

3、本地方法栈:做用和虚拟机栈同样,区别是虚拟机为java方法服务,本地方法栈是为native方法服务,虚拟机规范中对本地方法栈没有语言,数据结构,使用方式的限制,能够有虚拟机自由实现,有些虚拟机就把他们合并。  这个区域也会抛出StackOverflowError,OutOfMemoryError异常。

4、堆:此部分是线程共享的,在虚拟机启动的时候建立,存放对象的实例,数据,是jvm最大的一块,垃圾回收器也是对此部份内存的回收。若是堆中没有完成实例分配,不能扩展的时候,会抛OutOfMemoryError。

5、方法区:存放被虚拟机加载的类信息(方法,字段),常量,静态变量。

在方法区中有一个很是重要的部分就是运行时常量池,用于存放编译期生成的各类字面量和符号引用,它是每个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被建立出来。固然并不是Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,好比String的intern方法。

相关文章
相关标签/搜索