侧边栏壁纸
博主头像
DJ's Blog博主等级

行动起来,活在当下

  • 累计撰写 133 篇文章
  • 累计创建 51 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

【JVM】运行时数据区

Administrator
2022-04-04 / 0 评论 / 0 点赞 / 47 阅读 / 4121 字

【JVM】运行时数据区

方法区(Method Area)

作用

  • 存储已被虚拟机加载的类信息(类的版本、字段、方法、接口等描述)、运行时常量池(Runtime Constant Pool)、常量、静态变量、即时编译器编译后的代码(如JSP)等数据。

特性

  • 在虚拟机启动时创建
  • 各个线程共享
  • 堆的一个逻辑部分,非堆(Non-Heap)
  • 无法满足内存分配需求时,将抛出OutOfMemoryError异常。
  • JDK>=8:Metaspace;JDK<8:Perm Space

堆(Heap)

作用

  • 存储Java对象实例以及数组

特性

  • 虚拟机启动时创建
  • 各个线程共享
  • Java虚拟机所管理内存中最大的一块
  • 无法满足内存分配需求时,将抛出OutOfMemoryError异常。

对象内存布局

虚拟机栈(JVM Stacks)

作用

  • 存储一个Java线程的运行状态

特性

  • 随着线程的创建而创建
  • 线程私有
  • 栈帧太多耗尽栈空间,将抛出StackOverflow异常

栈帧

官网参考:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.6

定义

  • 每一个被线程执行的方法

操作

  • 压栈:调用一个方法,压入一个栈帧
  • 出栈:方法调用完成,把该栈帧从栈中弹出

组成部分

局部变量表(Local Variables)
  • 组成部分:方法中定义的局部变量和方法的参数
  • 使用方式:通过相关指令将其加载至操作数栈中作为操作数使用
操作数栈(Operand Stack)
  • 以压栈和出栈的方式存储操作数
动态链接
  • 指向运行时常量池的引用(A reference to the run-time constant pool)
方法返回地址(Return Address)
  • 存放调用该方法的PC寄存器的值。也就是调用该方法的位置。
附加信息

本地方法栈(Native Method Stacks)

作用

  • 存储Native方法,如果当前线程执行的方法是Native类型的,这些方法就会在本地方法栈中执行。
  • Native Stack与Java Stack所发挥的作用非常相似,他们之间的区别在于Java Stack为Java Stack执行Java方法(也就是字节码)服务,而Native Stack则为使用到Native方法服务。

程序计数器(PC Register)

作用

  • 记录线程执行的位置,为了线程切换后能够恢复到正确的执行位置

特性

  • 随着线程的创建而创建
  • 线程私有
  • 线程正在执行Java方法,则计数器记录的是正在执行的虚拟机字节码指令的地址;正在执行的是Native方法,则这个计数器为空。

联系

栈指向堆


在栈帧中有引用类型的变量,比如Object obj=new Object()

方法区指向堆


方法区中存放引用类型的静态变量,比如private static Object obj = new Object();

堆指向方法区

0
jvm

评论区