《深刻理解Java虚拟机》笔记——第二章(1)

    Java虚拟机运行时内存区域分为程序计数器、虚拟机栈、本地方法栈、堆、方法区等。java

    程序计数器:线程私有,用来指示须要执行的下一条字节码指令,若是当前正在执行native方法,则为空(Undefined),在虚拟机规范中惟一没有规定OOM Error的区域。
函数

    虚拟机栈:线程私有,每调用一个方法,都建立一个栈帧压入虚拟机栈,用来存储局部变量表等信息,方法执行完后相应栈帧出栈。局部变量表存储的是编译期可知的各类基础类型和对象引用以及returnAddress(指向一条字节码指令的地址),其中long和double类型占2个局部变量空间,其他类型占用1个。局部变量表大小在运行时不会改变。若是栈深度超过容许值,则抛出StackOverflowError,若是扩展时没法申请足够内存,则抛出OutOfMemoryError。
spa

    本地方法栈:线程私有,与虚拟机栈相似,只不过是在调用native方法时使用。
操作系统

    堆:公有,通常来讲是最大的一块内存区域,几乎全部的对象实例都存储在堆上。若是堆中空间不够,并且也无法继续扩展,将抛出OutOfMemoryError。
线程

    方法区:公有,主要存储加载的类信息、常量、静态变量。若是空间不足,将抛出OutOfMemoryError。
code

    运行时常量池:公有,是方法区的一部分,主要存放常量,在运行时能够动态加入新的常量(好比String的intern()方法)。若是空间不足,将抛出OutOfMemoryError。对象

    直接内存:公有,在堆之外经过native函数分配的内存,虽然不受堆大小制约,可是仍然不能超过操做系统和物理内存的限制,若是空间不足,将抛出OutOfMemoryError。内存


    例如以下的代码:虚拟机

Object obj=new Object();

    其中Object obj会在本地变量表中存储obj变量,new Object()会在堆上分配一个Object实例的空间,而Object类的信息则载入到方法区中。
编译

相关文章
相关标签/搜索