美文网首页
Java运行时数据区

Java运行时数据区

作者: 游牧族人 | 来源:发表于2018-05-07 18:57 被阅读20次

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

    1.程序计数器(线程私有)

    程序计数器是一块较小的内存空间,他可以看做是当前线程所执行的字节码的行号指示器。分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。
    如果当前运行的是一个java方法,那么程序计数器记录的是正在执行的虚拟机字节码指定的地址,如果运行的是一个本地的native方法,那么计数器的值为空。

    2.虚拟机栈(线程私有)

    虚拟机栈描述的是java方法的内存模型,每个java方法在执行的时候都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用到结束,都对应着一个栈帧在虚拟机栈中入栈和出栈的过程。
    局部变量表:
    存放着编译期可知的各种基本数据类型(int,float...)、对象的引用和方法返回地址。局部变量表的大小是在编译期间就决定下来的,运行时不会改变局部变量表的空间大小。

    3.本地方法栈(线程私有)

    与虚拟机栈的作用类似,不过只是本地方法栈为程序执行native本地方法服务。

    4.堆(线程共享)

    java堆是jvm启动时创建的一块内存区域,该区域只用来存放对象实例和数组。java堆可以出于物理上不连续的内存区域,只要逻辑上是连续的即可。java堆是垃圾收集器的主要管理区域。

    5.方法区(线程共享)

    java方法区用来存储已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。运行时常量池就位于方法区中。

    OOM:
    OOM:内存溢出异常。
    一般在java程序运行过程中,除了程序计数器之外,其他的java运行时数据区都有可能抛出OOM异常。
    虚拟机栈和本地方法栈中,当线程请求的栈深度大于虚拟机所允许的栈深度时,会抛出StackOverflowError异常。如果虚拟机栈支持扩展并且即使扩展之后也无法满足程序运行需要的内存,便会抛出OutOfMemoryError异常。
    如果java程序在堆上没有完成实例分配且堆也无法完成自身扩展时,程序便会抛出OutOfMemoryError异常。
    当方法区无法满足内存分配需求时,便也会抛出OutOfMemoryError异常。

    相关文章

      网友评论

          本文标题:Java运行时数据区

          本文链接:https://www.haomeiwen.com/subject/fkbvrftx.html