手机访问          
logo
JAVA运行时数据区域
更新时间:2017-06-02 20:38:51    650次阅读 评论 0

 

运行时数据区域包含哪几部分?

    根据《Java虚拟机规范》的规定,运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。


QQ截图20170602202457.png



程序计数器

程序计数器是一块较小的内存空间,它可以看做是当前线程(每个线程都有一个独立的程序计数器)所执行的字节码的行号指示器。


Java虚拟机栈

Java虚拟机栈也是也是线程私有的。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。

我们平时把Java内存区分为堆内存栈内存,其中的栈内存就是虚拟机栈中的局部变量表部分。


(如果线程请求的深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机可以动态扩展,扩展时仍无法申请到足够的内存,就会抛出OutOfMemoryError异常)

本地方法栈

本地方法栈与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务。



Java堆

Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。

(如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常)


方法区

方法区也是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息常量静态变量即时编译器编译后的代码等数据。

(当方法区无法满足内存分配的需求时,将抛出OutOfMemoryError异常)


运行时常量池(方法区的一部分)

Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

(当常量吃无法再申请到内存时会抛出OutOfMemoryError异常)


直接内存

直接内存不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。Java NIO可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。

(这块区域也会在内存不足时,动态扩展出现OutOfMemoryError异常)

转自 http://www.cnblogs.com/zawier/p/6816781.html


分享按钮 分类:java
  

create:2017-05-29    阅读量(650) 评论( 0 )

返回顶部
登录评论
  ABOUT ME
头像
昵称零零一
博龄 { 59.6月 }
积分610
博主被推荐的文章
相关博文
推荐博文
    程序员保本计划书
    微信网页授权策略思考-编程笔记(二)
    SET NOCOUNT ON
    SQL Server中@@ROWCOUN
    对象不能从DBNULL转换为其他类型
    SQL Server SUBSTRING
    ps热键一览表
    \r\n到底是啥意思?
    微信接口调用出现 the permiss
    declare使用方法
标签云
反馈 联系©2015-2016 2016 ©zhoubo15.cn 粤ICP备15029033号-1