运行时数据区示意图

1. 程序计数器

占用一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。主要用来记录线程执行到哪条语句了,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完成。

如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器值则为空。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

2. Java 虚拟机栈

线程私有,生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

局部变量表存放了编译期可知的各种基本数据类型、对象引用和returnAddress类型(指向了一条字节码指令的地址)。局部变量表所需的内存空间在编译期间完成分配,在方法运行期间不会改变局部变量表的大小。

在Java虚拟机规范中,对该区域规定了两种异常状况:1) 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。 2)如果虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。

3. 本地方法栈

本地方法栈与虚拟机栈所发挥的作用非常相似,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务。

4. Java堆

Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。几乎所有的对象实例都在这里分配内存。

Java堆可分为:新生代和老年代。新生代又可细分为:Eden 区、From Survivor 区、To Survivor 区。

如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

5. 方法区

方法区与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。有人也称方法区为“永久代”,但是本质上两者并不等价。某些虚拟机并不存在永久代的概念。

JDK1.8中,永久区被彻底移除,使用了新的元数据区存放类的元数据。默认情况下,元数据区只受系统可用内存的限制,但依然可以使用参数-XX:MaxMetaspaceSize指定永久区的最大可用值。

6. 运行时常量池

运行时常量池是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于代表会放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

7. 直接内存

直接内存并不是虚拟机运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域。但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryerror异常。

在JDK 1.4中新加入了NIO类,引入了一种基于Channel与缓冲区的I/O方式。它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBufer对象作为这块内存的引用进行操作。这样能在一些场合中显著提高性能,因为避免了在java堆和native堆中来回复制数据。

转载于:https://www.cnblogs.com/langfanyun/p/7020290.html

《深入理解Java虚拟机》笔记01 -- 运行时数据区相关推荐

  1. JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈

    运行时数据区概述及线程概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JV ...

  2. Java内存管理:Java内存区域 JVM运行时数据区

    Java内存管理:Java内存区域 JVM运行时数据区 在前面的一些文章了解到javac编译的大体过程.Class文件结构.以及JVM字节码指令. 下面我们详细了解Java内存区域:先说明JVM规范定 ...

  3. 【JVM学习笔记】运行时数据区

    一.运行时数据区与线程概述 1 运行时数据区的结构   其中方法区和堆是随着虚拟机的创建而创建摧毁而摧毁,为各个线程所共用.而程序计数器(PC).本地方法栈(NMS).虚拟机栈(VMS)则是随着某个线 ...

  4. java虚拟机之一内存运行时数据区域解释

    Java虚拟机管理的内存运行时数据区域解释 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启 ...

  5. 虚拟机系列 | JVM运行时数据区

    本文源码:GitHub·点这里 || GitEE·点这里 一.内存与线程 1.内存结构 内存是计算机的重要部件之一,它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存性能的强弱 ...

  6. JVM笔记-13运行时数据区-堆(OOM、年轻代老年代)

    学习JVM的一点简单笔记,宋红康老师jvm讲的很好,感谢. 尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) OOM 异常是什么? 堆空间溢出,存放数据大于堆空间大小. packa ...

  7. 【JVM】运行时数据区概述(程序计数器、虚拟机栈、本地方法栈)

    前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会 ...

  8. 【JVM】运行时数据区介绍,程序计数器和虚拟机栈详解

    JVM越来越是Java面试中的重头戏,今天来总结一下JVM运行时数据区的相关内容. 文章目录 JVM运行时数据区 JVM运行时数据区内部结构 程序计数器(PC寄存器) 程序计数器的介绍 PC寄存器的实 ...

  9. Java程序员必知必会之JVM运行时数据区

    JVM类加载概述 JVM垃圾回收概述 运行时数据区概述 程序计数器(Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,指向下一个将要 ...

最新文章

  1. GAAFET与FinFET架构
  2. 问题八十八:Fibonacci数非递归解
  3. 【Linux】19.Linux环境变量名LD_LIBRARY_PATH 和 ldd命令详解
  4. linux 两个驱动 竞态,第7章 Linux设备驱动中的并发控制之一(并发与竞态)
  5. return print
  6. SparkJavaAPI:join的使用
  7. luogu P1858 多人背包
  8. 【Cite 1.7K】Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour
  9. 三年的总结(技术篇)
  10. JDK使用最多的模式之一--观察者模式
  11. 如何破解校园网wifi?怎样破解校园网不能共享wifi?校园网路由器如何破解?
  12. java工作流程引擎比较,技术架构选型。你喜欢用那种?
  13. win7 计算机设置命令,win7系统如何设置自动关机?
  14. notimplementedexception
  15. NSDI 2021 Breaking the Transience-Equilibrium Nexus: A New Approach to Datacenter Packet Transport笔记
  16. RuntimeError: Trying to backward through the graph a second time (or directly access saved tensors a
  17. 经纬度5位数和6位数差多少_经纬度精度差别 - Rain - OSCHINA - 中文开源技术交流社区...
  18. linux设置为adhoc模式,Linux下两台笔记本电脑adhoc模式搭建局域网跟adhoc无线自组织网络...
  19. 年轻的90后就应该马上创业不要等
  20. 999句最常用英语口语

热门文章

  1. php的服务器变量$SERVER以及防止$_SERVER['PHP_SELF']造成的XSS漏洞攻击及其解决方案
  2. Java项目开发全程实录pdf
  3. 一条正确的Java职业生涯规划,从理论到实践!
  4. 【深度学习】Keras和Tensorflow框架使用区别辨析
  5. python【力扣LeetCode算法题库】1162- 地图分析(BFS)
  6. python【力扣LeetCode算法题库】面试题40- 最小的k个数
  7. 【深度学习笔记】ROC曲线 vs Precision-Recall曲线
  8. c# mysql 编码_C#编码问题以及C#往Mysql插数据编码问题
  9. ping 不通 华为三层交换机vlan_华为交换机常用的三种vlan划分方法,一文了解清楚vlan...
  10. ecm工作原理 usb_USB中CDC-ECM的了解和配置