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. Nexus私服搭建使用及发布jar包到私服上供团队其他成员使用

    1.下载maven解压到指定目录,并配置环境变量 M2_HOME为maven解压目录 2.path中增加 %M2_HOME%\bin, 并确认 mvn -v 正确 3.下载nexus http://w ...

  2. Django 模板.html中 href参数传入

    在Django模板中可能会出现访问多个URL指向同一函数,为减少代码可以利用正则表达式实现 url(r'^remove_userinfo(?P<nid>\d+)/',views.remov ...

  3. JQ在线引用地址

    1.7.2版本 百度的引用地址: <script  src="http://libs.baidu.com/jquery/1.7.2/jquery.min.js">< ...

  4. C++中4个类型转换相关的关键字/特点/应用场合

    reinterpret_cast是C++里面的一个强制类型转换符,能够将任何的指针类型转换成其他的任何指针类型:能够将任何的整数类型转换成指针类型,反之亦然:滥用reinterpret_cast强制类 ...

  5. 高性能消息队列 CKafka 核心原理介绍(上)

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:闫燕飞 1.背景 Ckafka是基础架构部开发的高性能.高可用消息中间件,其主要用于消息传输.网站活动追踪.运营监控.日志聚合.流式 ...

  6. Spring定时任务quartz表达式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp32 0 0 12 * * ?---------------在每天中午12: ...

  7. Sqlite数据库添加数据以及查询数据方法

    只是两个添加查询方法而已,怕时间长不用忘了

  8. JS查错小工具-三生有幸【推荐】

    H5和CSS语言在开发者官网上都有在线查错工具,同样的,更加复杂的JavaScript也需要一个查错工具,(别指望DreamWeaver了,debug功能做的太垃圾,还不如Firefox自带的强..) ...

  9. 201521123060 《Java程序设计》第3周学习总结

    1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...

  10. 201521123075 《Java程序设计》第2周学习总结

    1. 本周学习总结 各种数据类型,运算符,表达式的使用: 字符串String类; 对数组对象和字符串对象的运用. 2. 书面作业 1.使用Eclipse关联jdk源代码,并查看String对象的源代码 ...