Java虚拟机管理的内存包括如图所示的运行时数据区域:

下面分别进行介绍:

1)程序计数器(Program Counter Register)

  • 占用的内存空间比较小,主要作用就是标识当前线程执行的字节码的行号。字节码解释器的工作就是通过不断改变计数器的值来获取下一条要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖程序计数器。
  • 程序计数器在每个线程中都是独立互不影响的,因为Java虚拟机多线程的实现是通过轮流切换并分配时间给每个线程来完成的。每个处理器在一个确定的时刻只会执行一条线程中的指令,切换线程之后需要恢复到正确的执行位置。
  • 计数器值的含义:如果正在执行的是Java方法,记录的是字节码指令的地址;如果执行的是Native方法,则计数器值为空(Undefined),该内存区域是唯一一个在虚拟机规范中没有规定任何OutOfMemoryError的区域。

2)Java虚拟机栈(Java Virtual Machine Stacks)

  • 线程私有,生命周期与线程相同。
  • 含义:描述的是Java方法执行的内存模型。每个方法在执行时会创建一个栈帧(Stack Frame)用来存储局部变量表、操作数栈、动态链接、方法出口等信息。方法从调用开始到执行结束的过程就是栈帧在虚拟机栈中入栈到出栈的过程。
  • 局部变量表存放的是int等各种基本数据类型、对象引用以及指向下一条执行地址的returnAddress类型等。
  • 64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的类型只占1个。
  • 方法运行期间不会改变局部变量表的大小。
  • 两种异常情况:StackOverflowError(线程请求的栈深度大于虚拟机允许的深度);OutOfMemoryError(虚拟机动态扩展时无法申请到足够的内存)。

3)本地方法栈(Native Method Stack)

  • 与虚拟机栈功能类似,区别:虚拟机栈执行的是Java(字节码)服务;本地方法栈为Native方法服务。
  • 抛出的异常:StackOverflowError和OutOfMemoryError。
4)Java堆(Java Heap)
  • 所有线程共享,虚拟机启动时创建;
  • 用来存放对象的实例:所有的对象实例和数组都要在堆上分配;
  • 还可以细分:新生代、老年代;Eden、From Survivor、To Survivor;
  • 堆可以处于物理上不连续的内存空间中;
  • 异常:OutOfMemoryError,对重没有内存来完成实例分配并且也不能再扩展时。

5)方法区(Method Area)

  • 各线程共享;
  • 存储内容:已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。
  • 被称为永久代(但是不严格。。)。
  • 限制比较宽松:不需要连续的内存、可以选择固定大小或者可扩展、可以不实现垃圾收集。
  • 该区域内存回收的目标:针对常量池的回收和对类型的卸载。
  • 异常:OutOfMemoryError,该区域无法满足内存分配需求时。
6)运行时常量池(Runtime Constant Pool)
  • 方法区的一部分;
  • Class文件内容:类的版本、字段、方法、接口等描述信息和常量池(Constant Pool Table);
  • 常量池作用:存放编译期生成的各种字面量和符号引用。
  • 动态性:Java并不要求常量一定要在编译器才能产生,运行期间也可以将新的常量放入池中,应用--String.intern()方法
  • 异常:OutOfMemoryError,运行时常量是方法去的一部分,类似,无法申请到内存时就抛出异常。

7)直接内存(Direct Memory)

    • 不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。
    • JDK1.4中:引入了NIO(New Input/Output),可以使用Native函数库直接分配堆外内存,然后通过存储在Java堆中的DirectByteBuffer对象作为这块内存的引用来进行操作,避免了再Java堆和Native堆中来回复制数据。

Java虚拟机-运行时数据区域的更多相关文章

  1. 关于Java虚拟机运行时数据区域的总结

    Java虚拟机运行时数据区域 程序计数器(Program Counter) 程序计数器作为一个概念模型,这个是用来指示下一条需要执行的字节码指令在哪. Java的多线程实际上是通过线程轮转做到的,如果 ...

  2. JVM学习(一)Java虚拟机运行时数据区域

    一.Java内存区域 1.运行时数据区域 根据<Java 虚拟机规范(Java SE 7 版)>规定,Java 虚拟机所管理的内存包括以下几个运行时数据区域: 1.1 程序计数器 程序计数 ...

  3. Java虚拟机运行时数据区域划分

        Java虚拟机数据运行时区域 方法区(Method Area) 存储加载的类信息,常量,静态变量,编译器编译后的代码等数据.虽然JVM规范把方法区描述为堆的一个逻辑部分,但它却有一个别名叫做N ...

  4. Java虚拟机运行时数据区域及垃圾回收算法

    程序计数器 记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空). Java 虚拟机栈 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表.操作数栈.动态链接.方法出口 ...

  5. JDK1.8-Java虚拟机运行时数据区域和HotSpot虚拟机的内存模型

    目录 介绍 官方文档规定的运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 虚拟机栈和本地方法栈溢出 Java堆 演示堆内存溢出 方法区 运行时常量池 演示方法区溢出 HotSpot虚拟机的内 ...

  6. 《深入理解Java虚拟机》(二)Java虚拟机运行时数据区

    Java虚拟机运行时数据区 详解 2.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第二章 ,为了整理思路,简单记录一下,方便后期查阅. 2.2 运行时数据区域 Java虚拟机 ...

  7. Java虚拟机运行时数据区

    运行时数据区程序计数器Java虚拟机栈本地方法栈Java堆(GC堆)方法区运行时常量池 运行时数据区 Java虚拟机在运行Java程序时,会将它所管理的内存划分为若干个内存区域.这些数据区域有各自的用 ...

  8. 面试常问的 Java 虚拟机运行时数据区

    写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...

  9. Java 虚拟机运行时数据区

    写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...

随机推荐

  1. os.path python使用遍历文件夹文件

    import os import os.path rootdir = "d:\data" # 指明被遍历的文件夹 for parent,dirnames,filenames in ...

  2. 标准的Java编码规范手册

    编码规范体现出一个开发者的基本素质,良好的编码规范可以提高团队编码的效率,避免很多不必要的问题.今天分享一个标准的Java编码规范给大家,希望对于大家今后的开发工作带来帮助. 编码规范的意义      ...

  3. Keil提示premature end of file错误 无法生成HEX文件

    今天舍友在使用Keil UV4的时候遇到一个问题:Keil提示premature end of file,无法生成hex文件. 代码是没有错误的.那么问题就出在设置上面了. 百度了一圈,发现很少人解答 ...

  4. Cython的用法以及填坑姿势

    因为项目需要,需要优化已有的Python代码.目前Python代码的执行过程是将Python代码转变成一行行指令,然后解释器解释指令的执行,调用到C代码层.如果去掉指令解释这个阶段,直接进入C代码层, ...

  5. 弹性布局flex

    前几天写过怪异盒子布局,以前在项目中用到弹性布局flex这个属性,当时没深入研究,这里各种查阅各种测试,把这个属性记录下 以免忘记, 弹性布局:是提供一种更加有效的方式来对一个容器中的条目进行排列.对 ...

  6. jQuery中getJSON跨域原理详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...

  7. Nand Flash驱动(实现初始化以及读操作)

    简单制作一个Nand Flash驱动(只需要初始化Flash以及读Flash) 打开2440芯片手册,K9F2G08U0M芯片手册(因为2440中Nand Flash是用的256MB(2Gb)内存,8 ...

  8. Day-11: IO编程

    由于CUP的运行速度远高于其他外设,IO操作有两种方式: 同步IO:CUP登着,程序暂停直到执行完后续代码 异步IO:CUP不等待,去做其他的事情,磁盘做完该做的事情后,告诉CUP,CUP再进行后续代 ...

  9. angularjs自定义指令实现分页插件

    由于最近的一个项目使用的是angularjs1.0的版本,涉及到分页查询数据的功能,后来自己就用自定义指令实现了该功能.现在单独做了个简易的小demo,主要是为了分享自己写的分页功能.注:本实例调用的 ...

  10. PHP(函数)

    <script> // 获得日 var time = new Date(); var x = time.getDate(); document.write(x+"日," ...