Java虚拟机-运行时数据区域
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。
- 所有线程共享,虚拟机启动时创建;
- 用来存放对象的实例:所有的对象实例和数组都要在堆上分配;
- 还可以细分:新生代、老年代;Eden、From Survivor、To Survivor;
- 堆可以处于物理上不连续的内存空间中;
- 异常:OutOfMemoryError,对重没有内存来完成实例分配并且也不能再扩展时。
5)方法区(Method Area)
- 各线程共享;
- 存储内容:已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等。
- 被称为永久代(但是不严格。。)。
- 限制比较宽松:不需要连续的内存、可以选择固定大小或者可扩展、可以不实现垃圾收集。
- 该区域内存回收的目标:针对常量池的回收和对类型的卸载。
- 异常:OutOfMemoryError,该区域无法满足内存分配需求时。
- 方法区的一部分;
- Class文件内容:类的版本、字段、方法、接口等描述信息和常量池(Constant Pool Table);
- 常量池作用:存放编译期生成的各种字面量和符号引用。
- 动态性:Java并不要求常量一定要在编译器才能产生,运行期间也可以将新的常量放入池中,应用--String.intern()方法
- 异常:OutOfMemoryError,运行时常量是方法去的一部分,类似,无法申请到内存时就抛出异常。
7)直接内存(Direct Memory)
- 不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。
- JDK1.4中:引入了NIO(New Input/Output),可以使用Native函数库直接分配堆外内存,然后通过存储在Java堆中的DirectByteBuffer对象作为这块内存的引用来进行操作,避免了再Java堆和Native堆中来回复制数据。
Java虚拟机-运行时数据区域的更多相关文章
- 关于Java虚拟机运行时数据区域的总结
Java虚拟机运行时数据区域 程序计数器(Program Counter) 程序计数器作为一个概念模型,这个是用来指示下一条需要执行的字节码指令在哪. Java的多线程实际上是通过线程轮转做到的,如果 ...
- JVM学习(一)Java虚拟机运行时数据区域
一.Java内存区域 1.运行时数据区域 根据<Java 虚拟机规范(Java SE 7 版)>规定,Java 虚拟机所管理的内存包括以下几个运行时数据区域: 1.1 程序计数器 程序计数 ...
- Java虚拟机运行时数据区域划分
Java虚拟机数据运行时区域 方法区(Method Area) 存储加载的类信息,常量,静态变量,编译器编译后的代码等数据.虽然JVM规范把方法区描述为堆的一个逻辑部分,但它却有一个别名叫做N ...
- Java虚拟机运行时数据区域及垃圾回收算法
程序计数器 记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空). Java 虚拟机栈 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表.操作数栈.动态链接.方法出口 ...
- JDK1.8-Java虚拟机运行时数据区域和HotSpot虚拟机的内存模型
目录 介绍 官方文档规定的运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 虚拟机栈和本地方法栈溢出 Java堆 演示堆内存溢出 方法区 运行时常量池 演示方法区溢出 HotSpot虚拟机的内 ...
- 《深入理解Java虚拟机》(二)Java虚拟机运行时数据区
Java虚拟机运行时数据区 详解 2.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第二章 ,为了整理思路,简单记录一下,方便后期查阅. 2.2 运行时数据区域 Java虚拟机 ...
- Java虚拟机运行时数据区
运行时数据区程序计数器Java虚拟机栈本地方法栈Java堆(GC堆)方法区运行时常量池 运行时数据区 Java虚拟机在运行Java程序时,会将它所管理的内存划分为若干个内存区域.这些数据区域有各自的用 ...
- 面试常问的 Java 虚拟机运行时数据区
写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...
- Java 虚拟机运行时数据区
写在前面 本文描述的有关于 JVM 的运行时数据区是基于 HotSpot 虚拟机. 概述 JVM 在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...
随机推荐
- Python练习28
[之前发布到本人的51cto博客,现转过来] 无意看到老男孩的博文:合格linux运维人员必会的30道shell编程面试题及讲解 http://oldboy.blog.51cto.com/256141 ...
- JS中的数据类型小结
首先说说JS数据类型的分类.分为标准型和typeof类型(即控制台打印,浏览器区分) 标准型:基本类型中有:number.string.boolean.undefined.null 复合类型:obj ...
- DateTable转化为泛型集合
public class ListUtil { public static List<T> ToList<T>(DataTable dt) { List<T> li ...
- MySQL(十一)之触发器
上一篇介绍的是比较简单的视图,其实用起来是相对比较简单的,以后有什么更多的关于视图的用法,到时候在自己补充.接下来让我们一起了解一下触发器的使用! 一.触发器概述 1.1.什么是触发器 触发器(Tri ...
- 安卓两个build.gradle的区别
作为安卓入门选手,在导入第三方的时候才发现居然有两个build.gradle,我说咋不对啊,原来是导错了(可能是因为我没有看安卓培训的视频吧). 那么就说一下这两个的作用(一个Project的,一个M ...
- Jquery 父级元素、同级元素、子元素
prev():获取指定元素的上一个同级元素(是上一个哦). prevAll():获取指定元素的前边所有的同级元素. find():查找子元素方式 next(): 获取指定元素的下一个同级元素(注意是下 ...
- 探索JSP中的 "9大内置对象!"
1.什么是JSP内置对象? jsp内置对象就是Web容器创建的一组对象,我们都知道Tomcat可以看成是一种Web容器,所以我们可以知道所谓的内置对象Tomcat创建的,使用内置对象时可以不适用new ...
- px,em,rem的关系
之前听人说过,网站制作中字体单位应该用em而不用px,为什么呢?原因简单来说就是em支持IE6下的字体缩放,在页面中按ctrl+滚轮,字体以px为单位的网站没有反应.px是绝对单位,不支持IE的缩放, ...
- 四则运算题目生成程序(基于控制台)(Bug修改)
针对上个程序中出现的bug进行修改 https://git.coding.net/cx873230936/calculator.git Bug: 1.控制台输入问题数问题 a.不能处理用户输入负数. ...
- 第四次作业 四则运算器在C++层面上的进一步思考
OOA(Object Oriented Analysis,面向对象分析) 从客观存在的事务和事务之间的关系,归纳出有关对象(包括对象的属性和行为)以及对象之间的联系,并将具有相同属性和行为的对象用一个 ...