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. poj2051 Argus

    Description A data stream is a real-time, continuous, ordered sequence of items. Some examples inclu ...

  2. 求N个元素的子集合个数

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt406 一个集合有n个元素,请问怎么算出来它的子集(包括空集和本身)是 2的n ...

  3. JavaScript学习日志(六):事件

    这篇随笔,深恶痛绝,敲到快结束的时候,凌晨00:19,突然闪退,也不知道是Mac的原因还是chrome的原因,重新打开的时候,以为自动保存有效果,心想没关系,结果他么的只保存了四分之一,WTF?!!! ...

  4. JTemplates + $.Ajax

    上篇基础使用后: +AJAX 只需要改列名即可 :<script type="text/template" id="foreach">   里的循环 ...

  5. [我所理解的REST] 2.REST用来干什么的?

    笔者每当遇到一个新事物的想去了解的时候,总是会问上自己第一个问题,这个新事物是干什么用的?在解释我所理解的REST这个过程中也不例外,这篇博客我们先关注一下REST是干什么用的,然后后续再解释REST ...

  6. 团队作业9——展示博客(Bata版本)

    1.团队成员介绍及项目地址 团队的源码仓库地址:https://coding.net/u/app24dian/p/app24dian/git 陈麟凤:(http://www.cnblogs.com/c ...

  7. 201521123082 《Java程序设计》第5周学习总结

    201521123082 <Java程序设计>第5周学习总结 标签(空格分隔): java 1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规 ...

  8. 201521123072《java程序设计》第七周总结

    201521123072<java程序设计>第七周总结 标签: java 1. 本周学习总结 2. 书面作业 ArrayList代码分析 1.1 解释ArrayList的contains源 ...

  9. 201521123040 《Java程序设计》第6周学习总结

    1.本章学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 clone方法1.1 Object对象中的c ...

  10. 201521044091 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. ●接口可以定义行为,但却不能定义操作: ●使用abstract方法修饰可能变化的 ...