java的内存模型

来源:互联网 发布:马扎克数控车床编程 编辑:程序博客网 时间:2024/06/08 01:21

线程私有:程序计数器    虚拟机栈   本地方法栈

线程共享受: 堆    方法区

程序计数器 :当前线程所执行字节码的行数指示器。没有定义异常

虚拟机栈: java方法执行的内存模型,每一个java方法在执行的时候都会创建一个栈帧用来存储局部变量表、操作数栈、动态链接、方法出口等信息。

局部变量存放了编译期可知的基本类型和引用类型,局部变量表所需的内存空间在编译期间分配完成,运行期间不会改变大小

操作数栈中存放指令执行时所需要的操作数

动态链接:每个栈帧中都包含一个该栈帧所属方法的引用

方法出口:每一个方法结束无非是正常return或者抛出了Exception并且没有catch语句,在方法执行完之后需要返回到方法被调用的位置,返回时需要在栈帧中保存一些信息,用来帮助恢复它的上层方法的执行状态。可能抛出StackOverflowError或OutOfMemoryError

本地方法栈:为native方法服务(调用非java代码写的接口时会用到native)。可能抛出StackOverflowError或OutOfMemoryError

堆:虚拟机所管理内存中最大的一块,在虚拟机启动时创建,用于存放对象实例和数组,从垃圾回收的角度看分为新生代、老年代;再细致可分为Eden、From Survivor、To Survivor空间、老年代。可能出现OutOfMemoryError

方法区:用来存储虚拟机加载的类信息、常量、静态变量、即时编译后的代码数据。垃圾回收的对象为:常量池的回收和类型的卸载。可能出现OutOfMemoryError

运行时常量池(方法区的一部分):用来存放编译期生成的各种字面量(文本字符串、声明为final的常量)和符号引用(类的全限定名、字段和方法的名称和描述符)

还有一块不属于虚拟机运行时数据区的一部分为直接内存:例如nio中使用native函数库直接分配堆外内存,然后通过堆内的引用直接操作这块内存,避免了java堆和native堆的来回复制,可能抛出OutOfMemory异常





0 0
原创粉丝点击