关于Java虚拟机运行时数据区域的总结
Java虚拟机运行时数据区域
程序计数器(Program Counter)
程序计数器作为一个概念模型,这个是用来指示下一条需要执行的字节码指令在哪。
Java的多线程实际上是通过线程轮转做到的,如果是一个单核的机器(或单cpu),严格意义上在一个时间块中只会有一个线程在执行。为了线程切换以后能恢复到正确的执行位置,每个线程都需要有一个单独的计数器,每个计数器之间要是独立的互不干扰。

如果线程执行的是Java方法,那么PC指向的是正在执行的虚拟机字节码指令的区域,如果执行的是native方法,那么它是undefined。
Java虚拟机栈
Java virtue machine也是线程私有的,它拥有一个和线程相同的生命周期
虚拟机栈描述的是Java方法执行的内存模型;stack frame(栈帧)是一个经常谈及的概念,它用来储存内部变量表,操作数栈,动态链接,方法出口等等。
每一个方法从调用到执行完毕,也就对应着一个栈帧在虚拟机栈中的入栈和出栈
我们以前画图来说明内存区的时候,总是去关注Heap(堆内存)和stack(栈内存)这两部分,这是与对象内存分配最相关的两块内存区。通常所说的stack就是虚拟机栈,或者更具体的说是虚拟机栈中的局部变量表。
局部变量表存放了编译器可知的各种基本数据类型(boolean byte double char int short long float)对象引用(reference类型,并不是对象本身,可能是地址的引用指针,也可能是一个代代表对象的句柄)return address类型(指向一条字节码指令的地址)
局部变量表的意义就在于,可以把表所需的内存在编译器就进行分配,每次程序去调用一个方法的时候,方法需要在frame中分配多少的局部内存空间是确定的。
两种异常情况
如果线程请求的栈的深度大于虚拟机所允许的,就是StackOverFlowError,如果是支持动态拓展的虚拟机(大部分的现代虚拟机都支持)依然无法申请到足够的内存,就会报出OutOfMemoryError异常。
本地方法栈
本地方法栈是和Java虚拟机栈对应的一个概念,它们的作用也是相近的,唯一的不同是,本地方法栈执行的是native方法,而Java虚拟机栈执行的是Java方法(也就是字节码)服务
在Sun的HotSpot虚拟机里面,本地方法栈和虚拟机栈是一个。
Java堆
堆是被所有的线程所共享的一块区域,这块内存区域存在的唯一目的就是存放对象实例,在虚拟机启动的时候就会被创建,几乎所有的对象实例都会在这里被分配内存
所有的对象实例和数组都要在堆上分配 --《Java虚拟机规范》
随着JIT编译器的发展和逃逸技术的成熟,这句话也变得不是那么的绝对了。
GC(garbage collection)也发生在这个区域,所以有时候也被称为GC堆
方法区
方法区和Java堆相似,是线程共享的一段内存区域,它用于储存已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码。
听起来好像和Java堆很像,Java虚拟机标准里面也把它视为堆的一个逻辑部分,但是它被称作Non-Heap,目的是和Java堆区分开来。
Permanent Generation?那么,这个方法区就是永久代吗,并不是。只是在HotSpot虚拟机的设计中,用永久代来实现了方法区。(在JDK1.7中,已经把原本放在永久代的字符串常量池移出了)
运行时常量池(Runtime Constant Pool)
这也是方法区的一个较重要的部分,.class文件除了有类的版本,字段,方法,接口等描述信息外,还有一部分是常量池,用于在存放编译期生成的各种字面量(Literal)和符号引用(Symbolic References),这部分的内容在类加载以后进入运行时常量池中存放。
字面量比较好理解,是Java语言层面的常量,例如文本字符串,声明为final的变量
符号引用这个我第一时间没看懂什么意思,其实是编译原理的一个概念,包括以下的三种常量:
- 类和接口的全限定名
- 字段名称和描述符
- 方法名称和描述符
动态性,这是运行时常量池的一个重要的特性,在运行期间也可以将新的常量放进常量区(包括基本包装类和String,也可以调用intern()将String强制放进常量池)
为什么需要运行时常量池呢?
更少的内存。直接赋值的时候会利用常量池里面的对象,而不是去new了一个
更快的速度 。‘==’比equals()更快
Integer a = 23;//在编译的时候会变成Integer a = Integer.valueOf(23);使用的是线程池里面的对象
Integer b = new Integer(23);//创建了新的对象
ps.我感觉这个的设计思路和数据库连接池是差不多的,可以对照着去理解。
参考资料
《深入理解Java虚拟机》
关于Java虚拟机运行时数据区域的总结的更多相关文章
- Java虚拟机-运行时数据区域
Java虚拟机管理的内存包括如图所示的运行时数据区域: 下面分别进行介绍: 1)程序计数器(Program Counter Register) 占用的内存空间比较小,主要作用就是标识当前线程执行的字节 ...
- 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 程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以 ...
随机推荐
- SpringCloud解析之Eureka
本文基于Spring Cloud Edgware.SR6版本,从功能和架构上解析Eureka,让大家对Eureka有一个较为清晰的认识(本文默认大家对分布式微服务有一个初步的概念和理解,本文不涉及或少 ...
- SQL Server 表结构操作
一.创建表 --直接定义主外键 create table wallet( ID ) primary key, ,) not null, Name ) default '余额', Member_ID ) ...
- 《Graph Attention Network》阅读笔记
基本信息 论文题目:GRAPH ATTENTION NETWORKS 时间:2018 期刊:ICLR 主要动机 探讨图谱(Graph)作为输入的情况下如何用深度学习完成分类.预测等问题:通过堆叠这种层 ...
- 附录:1-Grain生命周期-译注
Grain Lifecycle Grains are logical entities that always exist, virtually, and have stable logical id ...
- GPS常识-B版(简)
第一章 绪论 1.简述GPS系统的特点有哪些? 在测绘工程中有如下优点:(1)定位精度高(2)观测时间短(3)测站间无需通视(4)可提供地心坐标(5)操作简便(6)全天候作业(7)功能多.应用广 GP ...
- 企业如何从“API优先”的策略中获益
在过去的几年里,全球API经济在以难以置信的速度进行快速地增长.物联网.人工智能.自动驾驶等等众多令人充满期待的技术正蓬勃发展,这也证明了API对于如今整个技术圈子的重要性,也预示着在不久的将来它还将 ...
- 基于百度EasyDL定制化图像识别平台的海洋鱼类识别方法
[目的]鱼类识别对渔业资源的开发利用有着重要的意义.针对海底环境恶劣.拍摄环境亮度低.场景模糊的实际情况导致海底观测视频品质差,视频中的鱼类识别难的问题以及现有鱼类识别方法存在的鱼类标注数据集过少导致 ...
- py+selenium IE 用driver.close()却把两个窗口都关了【已解决】
环境:py3 selenium unittest 测试浏览器:IE10 目标:在单个文件中,有多个用例,执行完A用例,由于打开了新的窗口,必须关闭新的窗口,才不会影响下一条用例的执行. 问题:按例 ...
- Java中的单例模式(Singleton Pattern in Java)
Introduction 对于系统中的某个类来说,只有一个实例是很重要的,比如只有一个timer和ID Producer.又比如在服务器程序中,配置信息保留在一个文件中,这些配置信息由一个单例对象统一 ...
- apache CXF Service 简单使用
cxf介绍 框架官网:cxf.apache.org 支持多种协议: SOAP1.1,1.2 XML/HTTP CORBA(Common Object Request Broker Architectu ...