JVM---JAVA内存区域

根据JAVA虚拟机规范,JAVA虚拟机所管理的内存包括以下几个运行时数据区域

  1.程序计数器

    可以看作当前线程所执行的字节码行号指示器。在虚拟机概念模型中(各虚拟机有自己的实现),字节码解释器就是通过改变这个程序计数器的值来选择需要执行的下一条字节码指令。

    是线程私有的。JAVA是多线程是通过轮询切换并分配处理器执行时间来实现的,每个线程独有一个程序计数器,则可保证线程切换后能在正确的位置往后执行。

    如果执行的是JAVA方法,这个线程的程序计数器记录的就是虚拟机字节码指令址;如果执行的是Native方法,则为Undefined。

    唯一一个JAVA虚拟机规范没有规定OutOfMemoryError的区域。

  2.虚拟机栈

    JAVA虚拟机栈是线程私有的

    每个方法执行时,都会创建一个栈帧(Stack Frame)。每个方法从开始调用到执行结束,对应着一个栈帧在虚拟机栈中入栈到出栈。(这个部分会在后续JVM中详细说明);用于保存局部变量表,操作数栈,动态链接,方法出口等信息

    局部变量表中存放基本类型,对象引用和returnAddress(这个部分会在后续JVM中详细说明)

    线程请求栈深度大于虚拟机所允许的深度,将抛出StackOverflowError

    栈空间不足,抛出OutOfMemoryError

  3.本地方法栈

    为Native方法服务,JAVA虚拟机规范没有强制规定怎么实现。HotSpot虚拟机将本地方法栈和虚拟机栈合二为一。

    也会抛出StackOverflowError和OutOfMemoryError

  4.堆

    JAVA虚拟机规范中,所有对象实例和数组在堆上分配。

    逃逸分析标量替换技术应用,所有对象在堆上分配不是那么绝对

    线程共享

    从内存回收角度:分为新生代(Eden,from,to)和老年代

    从内存分配角度:线程共享的堆可以划分去多个线程私有的分配缓存(TLAB)

    JAVA虚拟机规定,堆可以在物理上不连续空间,只要逻辑上连续即可

    可能会抛出OutOfMemoryError

  5.方法区

    线程共享

    存储类信息,常量,静态变量和即时编辑后的代码。

    HotSpot虚拟机在JDK1.7之前使用永久代来实现方法区(BEA JRockit和IBM J9不存在永久代),现在使用元空间(meta space)实现

    抛出OutOfMemoryError

  6.运行时常量

    是方法区的一部分

    JAVA虚拟机没有做任何细节的要求

    具备动态性,并非只有入lass文件中常量池的内容才能进入方法去的运行时常量池,还放翻译出来的直接引用,运行期间可能将新的量放入常量池中(String类的intern()方法)

    抛出OutOfMemoryError

 

2.直接内存

  不是JAVA规范中定义的区域,也不是JAVA虚拟机运行时区域的一部分。

  受机器总内存及处理器寻址空间的限制,会抛出OutOfMemoryError

   

posted on 2020-04-17 10:20  xingshouzhan  阅读(120)  评论(0编辑  收藏  举报

导航