标签:
1、Java内存模型
根据JVM虚拟机的规范,内存主要被分为以下七个部分:
1、PC寄存器
保存虚拟机正在执行的字节码的地址。字节码解释器在运行时就是通过改变PC寄存器来选取下一条需要执行的字节码指令,分支,循环,抛出异常,返回等需要依赖计数器完成。
2、堆
供动态内存分配,是JAVA虚拟机管理内存中最大的一块,也是被各个线程共享的内存区域。所有new出来的对象和数组对象都保存在堆区
3、虚拟机栈
简单的理解就是存储栈帧,在线程运行时创建。
4、本地栈
和虚拟机栈功能类似,提供本地非JAVA方法执行的栈
5、方法区
方法区与传统语言中的编译代码储存区( Storage Area Of Compiled Code)或者操作系统进程的正文段( Text Segment)的作用非常类似,它存储了每一个类的结构信息,例如运行时常量池( Runtime Constant Pool)、字段和方法数据、构造函数和普通方法的字节码内容、还包括一些在类、实例、接口初始化时用到的特殊方法。
这里的字段可以理解为静态变量的类型。比如类A有一个静态变量 static String c="C";那么这个字段里面就保存着这个变量的数据类型,引用变量c和值"C"都保存在常量池中。
每个类都有对应的方法区,在类被加载的时候创建。是被各个线程共享的内存区域。
6、常量池
运行时常量池( Runtime Constant Pool)是每一个类或接口的常量池( Constant_Pool )的运行时表示形式,它包括了若干种不同的常量:从编译期可知的数值字面量到必须运行期解析后才能获得的方法或字段引用。
7、栈帧
栈帧是用来存储数据和部分过程结果的数据结构,同时也被用来处理动态链接、方法返回值和异常分派。栈帧随着方法调用而创建,随着方法结束而销毁——无论方法是正常完成还是异常完成(抛出了在方法内未被捕获的异常)都算作方法结束。栈帧的存储空间分配在 Java 虚拟机栈之中,每一个栈帧都有自己的局部变量表、操作数栈和指向当前方法所属的类的运行时常量池的引用。局部变量表和操作数栈的容量是在编译期确定,并通过方法的 Code 属性保存及提供给栈帧使用。因此,栈帧容量的大小仅仅取决于 Java 虚拟机的实现和方法调用时可被分配的内存。
栈帧是线程本地私有的数据,不可能在一个栈帧之中引用另外一条线程的栈帧。
标签:
原文地址:http://www.cnblogs.com/maydow/p/4584361.html