在Java虚拟机的概念中,运行时数据区又被称为Java内存区域。主要由线程私有的程序计数器、虚拟机栈和本地方法栈以及线程共享的堆和方法区组成。

程序计数器

程序计数器在Java内存中占据的空间比较小,是当前线程正在执行的字节码的行号指示器。字节码指令执行的过程中,分支、循环、跳转、异常处理、线程恢复等都需要通过程序计数器来完成。
在某一个时刻,一个内核只会执行一个线程中的指令,因此需要程序计数器来确保多线程切换后回复到某一线程能够继续之前的指令向后执行。因此,这也就决定了程序计数器必须是线程私有的。
当线程执行的是Java方法时,程序计数器保存当前正在执行的指令的地址,而当线程执行的是native方法时,程序计数器的值为undefined
另外值得一提的是,程序计数器是运行时数据区中唯一不会出现OutOfMemoryError的。

Java虚拟机栈

当一个线程执行到某一个方法时,对应的是Java虚拟机创建一个栈帧,并将该栈帧压入虚拟机栈的过程。相对应的,方法结束则意味着虚拟机栈弹出该栈帧。

显而易见的是,局部变量表,存储的是方法中的局部变量。当局部变量是基本数据类型时,直接存储该变量的值,如果是引用数据类型,则存储对象引用。局部变量表在栈帧中分配的空间在编译阶段就已经确认,因此不会在方法运行期间改变大小。

本地方法栈

虚拟机栈和本地方法栈的原理十分相似,区别在于虚拟机栈执行的是Java方法,而本地方法栈执行的是Native方法。
由于JVM规范没有强制规定本地方法栈的实现,HotSpot虚拟机直接将本地方法栈和虚拟机栈合二为一。

对于C语言而言,堆是程序员可以直接管理的区域。程序员通过mallocfree方法申请和释放内存。
对于Java而言,堆存储着对象及对象数组。因此,也是垃圾回收器主要管理的区域。
根据JVM的规范,Java堆可以存储在物理不连续的区域,但逻辑上是连续的。对于大对象(如数组对象),很多虚拟机直接将它们存储在物理上连续的内存区域。另外,堆是所有线程共享的区域,因此JVM中只有一个堆。

方法区

方法区和堆一样,都是线程共享的区域。方法区存放了类的信息(类名、字段信息、方法信息)、静态变量、常量以及编译后的代码缓存等数据。
很多人将方法区和“永久代”混为一谈,原因是HotSpot把垃圾收集器的设计扩展到了方法区,从而省去为方法区专门编写内存管理代码的工作。
运行时常量池是方法区的一部分,用于存放常量池表,常量池表中存放了编译期生成的各种符号字面量和符号引用。

喜欢的给个赞呗

了解更多可以关注我的公众号:SKY技术修炼指南

c++指定在某一线程运行_深入理解Java虚拟机-运行时数据区相关推荐

  1. mysql种编译码写在哪_深入理解Java虚拟机(程序编译与代码优化)

    对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就从虚拟机层面来看看虚拟机对我们所编写的代码采用了哪些优 ...

  2. Java虚拟机不能满足_深入理解Java虚拟机--读书笔记1/3

    <深入理解Java虚拟机-JVM高级特性与最佳实践> Chap 2 Java内存区域与内存溢出异常 1.Java运行时数据区域 A.程序计数器:当前线程所执行字节码的行号指示器,线程私有( ...

  3. java6虚拟机_深入理解java虚拟机(六)

    虚拟机字节码执行引擎 代码编译的结果是从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步. 概述 执行引擎是Java虚拟机最核心的组成部分之一."虚拟机"是 ...

  4. java虚拟机编译顺序_深入理解Java虚拟机(程序编译与代码优化)

    文章首发于微信公众号:BaronTalk,欢迎关注! 对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就 ...

  5. JAVA类加载对字节码的处理_深入理解Java虚拟机(类文件结构+类加载机制+字节码执行引擎)...

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 周志明的< ...

  6. java虚拟机编程_深入理解Java虚拟机(一)

    一.运行时数据区域 1.程序计数器: 当前线程执行字节码的行号指示器(通过改变计数器的值来选择下条需要执行的字节码指令) 每个线程有独立的程序计数器(线程私有,为了切换线程时能恢复到挣钱的执行位置) ...

  7. java方法区内存泄露_深入理解java虚拟机-第二章:java内存区域与内存泄露异常...

    2.1概述: java将内存的管理(主要是回收工作),交由jvm管理,确实很省事,但是一点jvm因内存出现问题,排查起来将会很困难,为了能够成为独当一面的大牛呢,自然要了解vm是怎么去使用内存的. 2 ...

  8. 怎么把虚拟机清空内存_深入理解java虚拟机1——内存管理机制与回收机制

    文中涉及JVM底层知识大多来自<深入理解Java虚拟机>第2版,内容枯燥乏味,如果看,认真看.跟着撸一遍也可以受益良多. 1.JVM:是运行在操作系统之上的,它与硬件没有直接的交互. 运行 ...

  9. sas java 虚拟机异常_深入理解JAVA虚拟机之异常诊断

    常见的JAVA虚拟机HotSpot虚拟机运行时数据库由5部分构成:方法区,堆,虚拟机栈,本地方法栈,程序计数器.下面列举各个部分可能出现的异常及其出现原因. 1.方法区存放的已被虚拟机加载的类型信息, ...

最新文章

  1. webp的js插件_让浏览器全面兼容WebP图片格式
  2. html单行注释符号
  3. mysql检索有什么区别_检索行时,MySQL中AND或OR运算符有什么区别?
  4. 018-继承-OC笔记
  5. iOS属性之assign,copy,retain的区别以及weak和strong的区别
  6. Java高版本编译低版本运行_Java高版本编译低版本运行错误(ConcurrentHashMap.keySet)...
  7. leetcode 509. 斐波那契数(Java版)
  8. json符号解释大全_水电图纸图例大全,电气、弱电、给排水常用图例
  9. mysql+instr查询,mysql中使用instr进行模糊查询方法介绍
  10. 时间序列数据的特征提取
  11. 【实用】MAC电脑如何进行截图,mac下QQ截图工具的用法
  12. 华为P6-C00电信版,刷机总是失败? FAIL
  13. word下横线的线添加的方法
  14. Java邮件发送基于springboot实现
  15. Word替换重复的内容
  16. 研究:骇客又在合法的苹果Xcode专案上植入恶意程式
  17. 读书有益——》民间治咳偏方
  18. 显卡更新+pytorch安装
  19. [转摘]必须学好C++么?
  20. sqli-labs————less 20

热门文章

  1. 网页连接的服务器失败是怎么回事啊,网页怎么连接服务器失败
  2. 优达学城深度学习(之四)——jupyter notebook
  3. linux默认权限二进制与,Linux系统文件的默认权限和特殊权限
  4. 【utorrent】ubuntu 安装utorrent
  5. 电脑开机3秒就重启循环_小米9不开机、循环重启,插充电器屏幕没反应怎么回事?听说是通病,可以维修吗?...
  6. linux的vi命令输入C,Linux中C语言简单实现之vi篇(详细内容)
  7. php mencache扩展,【memcache缓存专题(3)】PHP-memcache扩展的安装以及使用
  8. lampp mysql最大连接数_mysql连接数问题备份
  9. ROS中阶笔记(一):机器人系统设计—ROS系统下连接外部传感器
  10. java源代码连接jsp,java网络五子棋的源代码-JSP教程,Java技巧及代码