美文网首页
jvm运行时区域

jvm运行时区域

作者: 程序男保姆 | 来源:发表于2020-04-07 15:05 被阅读0次
    image.png
    • 程序计数器

      1、 线程私有。
      2、 唯一一个没有OutOfMemoryError异常的区域。

    • 虚拟机栈

      1、线程私有。
      2、包含局部变量表,操作数栈,方法的返回地址,运行时常量池
      3、执行一个方法创建一个栈帧,并将建立的栈帧压栈。执行完毕后将栈帧出栈。因此可知,线程当前执行的方法所对应的栈帧必定位于Java栈的顶部。
      4、StackOverflowError异常
      线程请求的栈深度大于虚拟机所允许的深度时。
      例如:使用递归方法的时候容易导致栈内存溢出异常

      5、OutOfMemoryError 异常
      如果虚拟机栈可以动态扩展当扩展时无法申请到足够的内存时,就会OutOfMemoryError异常。
      6、局部变量表中用“”直接创建出来的字符串可以理解为是在运行时常量池中创建,并且用hashset保存 。

        下图表示了一个Java栈的模型
      
    image
    • java堆(线程共享)

    Java中的堆内存存储对象本身以及数组
    Java堆空间是Java垃圾收集器管理的主要区域。

    • 方法区(线程共享)

    方法区中,存储了每个类的信息(包括类的名称,方法信息,字段信息)、静态变量常量以及编译器编译后的代码等。

      • 常量池(存在方法区中,线程共享)

    在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。
    但是运行时也可以存放在常量池中,比如 Java String类中的intern()方法

    • 局部变量表

    用来存储方法中的局部变量(包括在方法中声明的非静态变量以及函数形参)。
    对于基本数据类型的变量,则直接存储它的值,
    对于引用类型的变量,则存储对象的引用。局部变量表的大小在编译器就可以确定其大小了,
    因此在程序执行期间局部变量表的大小是不会发生改变的。

    • 操作数栈

    栈最典型的一个应用就是用来对表达式求值。
    想想一个线程执行方法的过程中,实际上就是不断执行语句的过程,而归根到底就是进行计算的过程。因此可以这么说,
    程序中的所有计算过程都是借助操作数栈来完成的。

    • 指向运行时常量池的引用

    因为在方法执行的过程中有可能需要用到类中的常量,所以必须要有一个引用指向运行时常量。

    • 方法返回地址

    当一个方法执行完毕之后,要返回之前调用它的地方,因此栈帧中必须要保存一个方法返回地址。

    • 本地方法栈

    相关文章

      网友评论

          本文标题:jvm运行时区域

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