Java内存区域

来源:互联网 发布:程序员分类 知乎 编辑:程序博客网 时间:2024/06/06 02:29

最近在学校Java虚拟机方面的知识,借此写一点总结,这篇文章主要学习Java内存区域的知识

根据《Java虚拟机规范规定》Java虚拟机所管理的内存主要包括以下几个区域

-方法区
-堆
-虚拟机栈
-本地方法栈
-程序计数器

其中每个的主要作用如下:

程序计数器
    程序计数器是一块较小的内容空间,它可以看成是当前线程所执行的字节码的行号显示器,每条线程有一个独立的计数器,此内存区域是唯一一个Java虚拟机规范没有规定任何OutOfMemoryError情况的区域。

Java虚拟机栈
    与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期与线程相同。虚拟机栈描述Java方法执行的内存模型,每个方法执行的同时都会创建一个栈针,用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用到执行完的过程,就对应一个栈针在虚拟机栈中从入栈到除栈的过程。
    在Java虚拟机规范中,对这个区域规定了两种异常规范:如果线程所请求的栈深度大于虚拟机栈中所允许的深度,将抛出StackOverflowError。如果虚拟机可以动态扩展,当扩展时无法申请到足够的内存,则会抛出OutOfMemroyError。

本地方法栈
    本地方法栈所发挥的作用和虚拟机栈非常相似,只不过是虚拟栈为虚拟机执行Java方法而服务,而本地方法栈则为虚拟机用到的本地Native方法服务。本地方法栈也会抛出StackOverflowError和OutOfMemroyError异常。

JAVA堆
    Java堆是虚拟机所管理内存中最大的一块,Java堆是所有线程共享的一块内存区域,此内存的唯一目的就是存放实例对象,几乎所有的对象实例都在这里分配内存,Java堆也是垃圾收集器管理的主要区域。

方法区
    方法区域存放的是被虚拟机加载的类信息,常量,静态变量,即时编译后的代码等数据。Java虚拟机规范中将它描述成堆的一部分。常量池是方法区域的一部分,里面存放编译期生成的各种字面量和符号引用。

0 0
原创粉丝点击