您的位置:首页 > 编程语言 > Java开发

第二章 java内存区域与内存溢出异常

2015-01-27 15:28 381 查看
一、运行时的数据区域



java虚拟机运行时的数据区域

主要分为以下几个区域:

1 、程序计数器

它占用较小的一块内存空间,可以看做是当前线程执行的字节码的行号指示器。每个线程都需要拥有自己的的程序计数器,以满足在多线程情况下,线程不断切换自身能够恢复到正确状态,是线程私有的一块内存。在执行java程序的时候,它记录的是正在执行的虚拟机的字节码指令的地址,在执行本地方法的时候,它的值为空。它也是java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

2、java虚拟机栈

它也是线程私有的内存区域,生命周期和线程一样。每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等。每个方法从调用到执行结束就对应着一个栈帧在虚拟机栈中的入栈和出栈过程,局部变量表所需要的内存空间在编译的时候完成分配。

JVM stack 可以被实现成固定大小,也可以根据计算动态扩展。

在java虚拟机规范中,这块区域规定了两种异常,一个是当线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverFlow异常;另一个就是在虚拟机动态扩展的时候,无法申请到足够的内存,会抛出OutOfMemofyError异常。

3、Java堆

java堆是java虚拟机所管理的内存最大的一块区域,它被所有线程共享,在虚拟机启动的时候创建。它主要存放虚拟机的对象实例和数组。同时它也是垃圾收集器管理的主要区域,当堆中的内存不够完成实例的分配会抛出OutOfMemofyError异常。

java堆虽然是共享的,但是从内存分配的角度看,java堆中可能划分出多个线程私有的分配缓冲区(TLAB:Thead Local Allocation Buffer)

4、方法区

它也是线程共享的内存区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,当方法区中的内存不够完成内存的分配会抛出OutOfMemofyError异常。

5、运行时常量池

它是方法区的一个部分,用于存放编译期间生成的各种字面量和符号引用,这些内容在类加载后,进入到方法区的运行时常量池中。当方法区中的内存不够完成内存的分配会抛出OutOfMemofyError异常。

6、本地方法栈

它和虚拟机的java栈类似,不过本地方法栈为虚拟机执行java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务,它也会抛出StackOverFlow异常和OutOfMemofyError异常

7、 直接内存

它不是虚拟机运行时的数据区的一部分,也不是虚拟机规范中定义的内存区域,但是它会被频繁的使用。

二、
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: