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

原创
2014/09/22 16:42
阅读数 93

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

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

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

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

    堆:公有,一般来说是最大的一块内存区域,几乎所有的对象实例都存储在堆上。如果堆中空间不够,而且也没法继续扩展,将抛出OutOfMemoryError。

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

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

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


    例如如下的代码:

Object obj=new Object();

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


展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部