JVM-运行时数据区

    

  运行时数据区如图所示:

   

    程序计数器:当前线程私有的数据内存,用于记录字节码指令执行到哪了。为什么每个线程需要维护一个计数器,因为cpu在同一时刻只能执行一个指令,每个线程又有多个指令要执行,为了能使线程切换回来,知道指令执行到哪了。

          是JVM规范中,没有规定任何情况的OutOfMemory的区域。

     

    虚拟机栈:虚拟机栈描述的是方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧,每个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法执行到调用结束,对应着一个栈帧的入栈和出栈。

                                受栈的大小影响,超过会出现栈溢出。

    

    本地方法栈:和虚拟机栈功能一样,只不过虚拟机栈记录的是java代码的方法执行,本地方法栈记录的是虚拟机native方法的执行。

 

      堆:堆是所有线程共享的数据区,用于存储对象实例。例如数组,对象的内存分配等。

 

    方法区:用于存储被虚拟机加载的类信息、常量、静态变量和即时编译器编译后的代码数据等。

 

    运行时常量池:常量池属于方法区的一部分,用于存储编译时期各种字面量和和符号引用,但是非编译时期也能添加,运行时期也能加入新的常量,当然也会受方法区限制,出现OutOfMemory异常。

    

    直接内存:NIO分配缓存时,可以调用native方法,分配堆外内存,该内存不受堆内存大小限制,但是还是会受本机总内存大小影响,也会出现OOM。

    

posted @ 2019-12-30 15:41  欧E  阅读(121)  评论(0编辑  收藏  举报