微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JVM运行时数据区域

  • 线程私有区
    • 程序计数器
      • 当前线程所执行的字节码的行号指示器
      • 通过改变这个计数器的值来选取下一条需要执行的字节码指令
      • 每条线程都有一个独立的程序计数器,互不影响、独立存储,所以线程私有
      • 唯一一个没有规定任何OOM情况的区域
    • 虚拟机栈
      • 生命周期与线程相同
      • 每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧,用于存储局部变量表、操作数栈、动态连接、方法出口等信息
        • 局部变量表放的是编译器可知的各种基本数据类型、对象引用类型
        • 局部变量表存储空间以局部变量槽来表示,64位的Long和Double类型占两个变量槽
      • 每个方法都被调用,直到执行完毕的过程,对应着一个栈帧在虚拟机栈中从入栈到出栈道过程
      • 异常
        • 线程申请的栈深度大于虚拟机所允许的深度:StackOverflowError异常
        • 允许动态扩展下,扩展到无法再扩展:OutOfMemoryError异常
    • 本地方法
      • 和虚拟机栈非常相似,虚拟机栈为虚拟机执行Java方法服务,本地方法栈是为虚拟机使用到本地(Native)方法服务
      • HotSpot虚拟机直接就把本地方法栈和虚拟机栈合二为一
  • 线程共享区
      • 虚拟机启动时创建,用于存放对象实例,所有的对象实例以及数组都应当在堆上分配
      • Java堆是垃圾收集器管理的内存区域
      • Java堆可以实现固定大小,也可以扩展,主流的Java虚拟机都是按照可扩展来实现(参数-Xmx和-xms设定)
    • 方法
      • 存储已被虚拟机加载的类型信息、常量、静态变量、即使编译器编译后的代码缓存等数据
      • 运行时常量池
        • Class文件中有类的版本、字段、方法、接口等描述信息,还有一项常量池表
        • 用于存放编译器生成的各种字面量与符号引用,在类加载后存放到方法区的运行时常量池
        • 具备动态性
        • 常用String.intern()方法放入运行时常量池

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐